我只是在每行的开始/第一个/结束处添加了一个标记点,并内置了标记坐标,但听起来很奇怪:
\documentclass[border=10pt,varwidth=3cm]{standalone}
\usepackage{tikz}
\usepackage{listings}
\usetikzlibrary{tikzmark}
\usetikzmarklibrary{listings}
\begin{document}
\begin{lstlisting}[name=lst1]
line1
line2
line3
line4
\end{lstlisting}
\begin{tikzpicture}[remember picture,overlay]
\tikzset{dot/.style={circle,fill=red,minimum size=4pt,inner sep=0}}
\foreach \i in {0,...,4} {
\node[dot,fill=red!50] at (pic cs:line-lst1-\i-start) {};
\node[dot,fill=blue!50] at (pic cs:line-lst1-\i-first) {};
\node[dot,fill=green!50] at (pic cs:line-lst1-\i-end) {};
}
\end{tikzpicture}
\end{document}
两个问题:
- 如果我将起始索引设置为 0,我就只能看到第一行的起始点。
- 第一行第一个位置移至末尾。
答案1
第一行缺失的点是由于代码中的错误。紫色点应该位于第一个特点每一行,为此我必须连接到将每个非空格字符放置在页面上的代码。为了定位第一的字符,我使用了一个条件,当标记被放置时,该条件被设置为 false,而在行末被重置为 true。不幸的是,我忘记了 LaTeX 条件默认为 false,因此条件在代码开始时没有被设置为 true,这意味着它会等待第一个行末钩子才被激活。
解决方案是在文档开头将条件设置为真。直到这在发布的版本中起作用(现在github但通常我需要一点时间才能推送到 ctan),请在序言中使用以下内容:
\makeatletter
\global\lst@linemarktrue
\makeatother
当您将索引设置为 0 时,您看到的不是代码行开始的标记,而是整个代码块开始的标记。出于某种我现在不记得的原因,我使用了与行开头标记相同的命名约定。可能是因为它们都排成一行,这样更容易遍历它们。所以没有或first
标记,end
因为从技术上讲它不是一行。
(此外,代码中的空行只能获得start
标记而不是first
或,end
因为它们依赖于行上的实际文本。)
答案2
存在各种问题。随机放置的节点来自不存在相应标记的事实。tikzmark
有一个命令允许我们检查给定的标记是否存在,\iftikzmark
。将这些命令安装在循环中,这意味着我基本上复制了手册第 14 页上的示例tikzmark
,给出
\documentclass[border=10pt,varwidth=3cm]{standalone}
\usepackage{tikz}
\usepackage{listings}
\usetikzlibrary{tikzmark}
\usetikzmarklibrary{listings}
\begin{document}
\begin{lstlisting}[name=lst1]
line1
line2
line3
line4
\end{lstlisting}
\begin{tikzpicture}[remember picture,overlay]
\tikzset{dot/.style={circle,fill=red,minimum size=4pt,inner sep=0}}
\foreach \i in {1,...,4} {
\iftikzmark{line-lst1-\i-start}{
\node[dot,fill=red!50] at (pic cs:line-lst1-\i-start) {};
}{\message{No start for \i^^J}}
\iftikzmark{line-lst1-\i-first}{
\node[dot,fill=blue!50] at (pic cs:line-lst1-\i-first) {};
}{\message{No first for \i^^J}}
\iftikzmark{line-lst1-\i-end}{
\node[dot,fill=green!50] at (pic cs:line-lst1-\i-end) {};
}{\message{No end for \i^^J}}
}
\end{tikzpicture}
\end{document}
以及警告
1 还没有第一个
你会看到随机放置的节点消失了。不过,我同意以下说法:应该第一行也存在。也许这是一个应该报告的问题。
顺便说一句,你的文件给出了警告
程序包 varwidth 警告:无法重新处理输入第 27 行上的全部内容。 程序包 varwidth 警告:无法重新处理输入第 27 行上的全部内容。
这似乎与缺失的第一个标记无关。