引用程序源代码中的特定行

引用程序源代码中的特定行

如何引用程序源代码中的特定行(例如 Python)?例如,我想说:

在第 22-30 行中,该算法实现了……

如果我更改了 Python 源代码,“第 22-30 行”将自动更改以反映新的行号。

编辑:
我在用着minted

答案1

我不使用,但下面是我为内部使用的执行方法。在这里,我定义了将minted标签分配给源代码行的新命令。fancyvrbminted\VerbLabel{linex}{a $ a}linexa $ a

它是使用 expl3 编写的,因此请参阅 source3 文档以了解任何不合理的命令的解释。简而言之:propexpl3 中有一个“属性列表”数据类型,用于保存对值数据。\prop_gput是分配器,\prop_if_in用于测试密钥是否存在,并且\prop_get_gdel是一个访问器函数,之后还会删除条目。

\documentclass{article}
\usepackage{expl3,fancyvrb}
\begin{document}

\ExplSyntaxOn
\cs_generate_variant:Nn \prop_gput:Nnn {Nxn}
\cs_generate_variant:Nn \prop_get_gdel:NnN {NxN}
\cs_generate_variant:Nn \prop_if_in:NnT {NxT}

\prop_new:N \g_verb_label_prop
\newcommand \VerbLabel [2] {
  \prop_gput:Nxn \g_verb_label_prop { \tl_to_str:n {#2} } {#1}
}
\renewcommand \FancyVerbFormatLine [1] {
  #1
  \prop_if_in:NxT \g_verb_label_prop { \tl_to_str:n {#1} }
  {
    \prop_get_gdel:NxN \g_verb_label_prop { \tl_to_str:n {#1} } \l_tmpa_tl
    \label {verbline:\l_tmpa_tl}
  }
}
\ExplSyntaxOff

\VerbLabel{linex}{a $ a}
\VerbLabel{liney}{c & c}

See lines \ref{verbline:linex}--\ref{verbline:liney}

\begin{Verbatim}[numbers=left]
1 _ 1
a $ a
b # b
c & c
9 ^ 9
\end{Verbatim}
\end{document}

此代码中有一个错误,这意味着它不适用于包含#字符的行,但这不是一个无法解决的问题。

答案2

如果愿意使用带有grep命令的非常简单的 bash 脚本,那么就可以很容易地获取代码特定部分的行号,将该数字传递给声明\def并在 latex 文件中使用它。

grep以下是“和”组合答案的链接cuthttps://stackoverflow.com/a/21412398/7722668

该脚本看起来类似于 Python 源代码文件

#!/bin/bash
grep -n "some code of that line" /path/to/sourcecode.py | cut -d : -f 1 > linenum
read num < linenum
echo "\def\numoftheline{$num}" > linenumbers.tex

grep -n "code of some other line" /path/to/sourcecode.py | cut -d : -f 1 > linenum
read num < linenum
echo "\def\numofotherline{$num}" >> linenumbers.tex

如果该行的内容在源代码文件中是唯一的,则很容易获得,grep如果不是,则使用非常接近的行并num通过以下方式进行调整

num=$((num + 1))

在使用该echo部件之前。

我从这里得到这个信息:https://askubuntu.com/a/385531

确保在第一个命令之后的>>每个命令中都使用 来附加行。另一方面,每次都会覆盖文件 linenum。如果上面的行是 12 和 20,文件 linenumbers.tex 应该看起来像echogrep

\def\numoftheline{12}
\def\numofotherline{20}

并包括

\input{linenumbers}

在序言中,人们可以使用这些命令作为参考,并且这些命令在行\inputminted选择中可能更为重要:

\inputminted[firstline=\numoftheline,lastline=\numofotherline]{...

在大多数情况下,即使源代码发生了更改,它也能正常工作。

为了安全起见,可以检查是否grep发现任何东西,如果没有发现,则给出警告/错误,以避免类似

\def\numofline{}

我知道这有点复杂,但它确实有效,节省了我很多时间。我建议将该脚本保存在与.tex文件相同的文件夹中,并使用绝对路径grep

相关内容