我想绘制垂直规则在特定位置在环境中列表的左边距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
节点的正确位置。