         - on: 描画する context
      - returns: (描画する行の実質的な幅(長さ), xオフセット, yオフセット, ctline)
      */
-    private func getCTLine(range: NSRange, offset: CGFloat, burasagari: Bool = false, oikomi: Bool = false) -> (CGFloat, CGFloat, CGFloat, CTLine) {
-
-        // 描画開始位置を設定。offsetで行頭約物の位置を修正
-        let offsetX = self.startPosition.x + self.currentPosition.x + self.padding.left - offset
-        let offsetY = self.startPosition.y + self.currentPosition.y + self.padding.top
+    private func getCTLine(
+        range: NSRange,
+        headOffset: CGFloat,
+        tailOffset: CGFloat,
+        burasagari: Bool = false,
+        oikomi: Bool = false) -> (CGFloat, CGFloat, CGFloat, CTLine) {
 
         // 行を生成
-        var ctline = CTTypesetterCreateLine(
-            self.typesetter, CFRangeMake(range.location, range.length))
+        var ctline = CTTypesetterCreateLine(self.typesetter, CFRangeMake(range.location, range.length))
+
+        print(self.attributedText.substring(range).characters.first, self.attributedText.substring(range).characters.last)
+        print(headOffset, tailOffset)
 
         // 実質の文字の幅を取得
         let typographicWidth = CTLineGetTypographicBounds(ctline, nil, nil, nil)
-
-        // 均等揃えする。ぶら下がりのために、右側のスペースを開けておく
-        if let alignment = self.attributedText.textAlignment where alignment == .Justified {
+        let alignment = self.attributedText.textAlignment ?? .Left
+        var lineWidth = Double(self.width)
+
+        // 描画開始位置を設定。offsetで行頭約物の位置を修正
+        var offsetX = self.startPosition.x + self.currentPosition.x + self.padding.left
+        let offsetY = self.startPosition.y + self.currentPosition.y + self.padding.top
+
+        switch alignment {
+        case .Left:
+            offsetX += headOffset
+        case .Center:
+            offsetX += (self.width - CGFloat(typographicWidth)) / 2 + (headOffset + tailOffset)
+        case .Right:
+            offsetX += self.width - CGFloat(typographicWidth) + tailOffset
+        case .Justified:
+            offsetX += headOffset
+            // ぶら下がりのために、右側のスペースを開けておく
             let burasagariSpace = burasagari ? Double(self.fontSize) : 0
             let oikomiSpace = oikomi ? Double(self.fontSize / 2) : 0
-            let lineWidth = Double(self.width) + burasagariSpace + oikomiSpace
+            lineWidth = lineWidth + burasagariSpace + oikomiSpace
             if typographicWidth > (lineWidth - Double(self.fontSize)) {
                 if let justifiedCtline = CTLineCreateJustifiedLine(ctline, 1, lineWidth) {
                     ctline = justifiedCtline
                 }
             }
+        default: break;
         }
         return (CGFloat(typographicWidth), offsetX, offsetY, ctline)
     }

        while self.location < self.length {

            self.goToNextLinePosition()
            var offset = self.getOffset()
            let (currentLineCount, burasagari, oikomi) = self.getSuggestedLineCount(offset)
            var range = self.getCurrentLineRange(currentLineCount)



     - parameter lineHead: 行頭文字
     */
    private func getHeadOffset(lineHead: String? = nil) -> CGFloat {
        return kCharactersHaveLeftSpace.contains(lineHead ?? self.getLineHead()) ? self.fontHalfWidth * -1 : 0
    }

    /**
     行末オフセットを取得。カーニング対象文字の場合は、半角分のオフセット

     - parameter lineTail: 行末文字
     */
    private func getTailOffset(lineTail: String) -> CGFloat {
        return kCharactersHaveRightSpace.contains(lineTail) ? self.fontHalfWidth : 0
    }

    /**
