tikz - 列表标记位置奇怪的行为

tikz - 列表标记位置奇怪的行为

我只是在每行的开始/第一个/结束处添加了一个标记点​​,并内置了标记坐标,但听起来很奇怪:

\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}

两个问题:

  1. 如果我将起始索引设置为 0,我就只能看到第一行的起始点。
  2. 第一行第一个位置移至末尾。

在此处输入图片描述

答案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 行上的全部内容。

这似乎与缺失的第一个标记无关。

相关内容