                 }
                 
                 let size = CGSize(width: glyphWidth, height: glyphHeight)
-                path = invisible.path(in: size, isRTL: isRTL)
+                path = invisible.path(in: size, lineWidth: lineWidth, isRTL: isRTL)
                 
                 if cacheableInvisibles.contains(invisible) {
                     pathCache[codeUnit] = path

    ///
    /// - Parameters:
    ///   - size: The size of bounding box.
    ///   - isRTL: Whether the path will be used for right-to-left writing direction.
    /// - Returns: The path.
    func path(in size: CGSize, isRTL: Bool = false) -> CGPath {
        
        switch self {
            case .newLine:
                // -> Do not use `size.width` as new line glyphs actually have no area.
                let y = 0.4 * size.height
                let radius = 0.25 * size.height
                let path = CGMutablePath()
                // arrow body
                path.move(to: CGPoint(x: 0.9 * size.height, y: y - radius))

                path.addLine(to: CGPoint(x: 0.5 * size.height, y: y + radius + 0.25 * size.height))
                path.move(to: CGPoint(x: 0.2 * size.height, y: y + radius))
                path.addLine(to: CGPoint(x: 0.5 * size.height, y: y + radius - 0.25 * size.height))
                return path.copy(strokingWithWidth: lineWidth, lineCap: .round, lineJoin: .miter, miterLimit: 0, transform: transform)
            
            case .tab:
                // -> The width of tab is elastic and even can be (almost) zero.
