列表左侧的垂直线

列表左侧的垂直线

我想绘制垂直规则在特定位置在环境中列表的左边距listings。可以吗?

======= PSEUDO EXAMPLE =======

for i in range(5):
# One comment
    if i == 2:
# One comment
        print(i)

print("Finished....")

======= OUTPUT WISHED (this is ASCII art ! ) =======

   for i in range(5):
    # One comment
|      if i == 2:
|   # One comment
|          print(i)

    print("Finished....")   

答案1

您可以使用 TikZ 及其叠加功能……

这是我的解决方案。

代码

\documentclass{article}

\usepackage{xparse}
\usepackage{listings}
    \lstset{%
        escapechar=§% or what fits to your code
    }
\usepackage{tikz}
    \usetikzlibrary{calc}
    \tikzstyle{every lst line}=[line width=3pt, gray]
    % command for setting a TikZ anchor
    \newcommand{\tanc}[1]{%
        \begin{tikzpicture}[remember picture]
            \coordinate (#1) at (0,0);
%           \fill circle (0.5pt);% this line is for testing only
        \end{tikzpicture}%
    }
    % some parameters
    \def\DeltaX{4cm}
    \def\DeltaYi{6pt}
    \def\DeltaYii{0pt}
    % command for drawing the lines
    \NewDocumentCommand{\makeline}{O{0pt} m m O{}}{%
        \begin{tikzpicture}[remember picture, overlay, transform canvas={xshift=#1}]
            \draw [every lst line,#4] %
                let\p1=(#2), \p2=(#3), \p3=(current page.west) in%
                (\x3+\DeltaX,\y1+\DeltaYi) -- (\x3+\DeltaX,\y2+\DeltaYii);
            ;
        \end{tikzpicture}%
    }

\usepackage{lipsum}% for testing

\begin{document}
\lipsum[1]
%
\begin{lstlisting}
for i in range(5):
# Pu§\tanc{one}§t the anchor somewhere in the line
if i == 2:
# One comment §\tanc{two}§
    print(i) §\tanc{three}§
print("Finished....")§\tanc{four}§
\end{lstlisting}
\makeline{one}{two}\makeline{three}{four}[red]
\makeline[-7pt]{one}{four}[blue]
%
\lipsum[2]
\end{document}

设置

  • 选择一个永远不会出现在列表中的转义字符。我选择了§
  • 调整every lst line样式以适合您的口味。这是应用于使用\makeline
  • 调整参数以适合您的字体和布局。\DeltaX= 到页面左边框的距离,\DeltaYi= 列表中锚定行的基线与行首之间的偏移,\DeltaYii第二行也是如此。

用法

  • 将锚点放在您希望该行开始的行的某处\tanc{<name 1>}
    # Pu§\tanc{one}§t the anchor somewhere in the line

  • 放置第二个带有 的锚点\tanc{<name 2>}names至少对于列表来说 应该是唯一的。
    print(i) §\tanc{two}§

  • 用 画线\makeline{<name 1>}{<name 2>}
    \makeline{one}{two}

    您可以使用第二个可选参数更改线条的线条样式,并使用第一个参数水平移动线条:
    \makeline[<x shift>]{<name 1>}{<name 2>}[<style>]
    \makeline[-7pt]{one}{four}[blue]

    如果您加载了一个decoration库,您还可以使用参数添加大花括号或其他内容<style>

  • 运行 LaTeX 两次,否则 TikZ 无法获取remember picture节点的正确位置。

结果

结果

相关内容