如何引用程序源代码中的特定行(例如 Python)?例如,我想说:
在第 22-30 行中,该算法实现了……
如果我更改了 Python 源代码,“第 22-30 行”将自动更改以反映新的行号。
编辑:
我在用着minted
答案1
我不使用,但下面是我为内部使用的执行方法。在这里,我定义了将minted
标签分配给源代码行的新命令。fancyvrb
minted
\VerbLabel{linex}{a $ a}
linex
a $ a
它是使用 expl3 编写的,因此请参阅 source3 文档以了解任何不合理的命令的解释。简而言之:prop
expl3 中有一个“属性列表”数据类型,用于保存对值数据。\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
以下是“和”组合答案的链接cut
:https://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 应该看起来像echo
grep
\def\numoftheline{12}
\def\numofotherline{20}
并包括
\input{linenumbers}
在序言中,人们可以使用这些命令作为参考,并且这些命令在行\inputminted
选择中可能更为重要:
\inputminted[firstline=\numoftheline,lastline=\numofotherline]{...
在大多数情况下,即使源代码发生了更改,它也能正常工作。
为了安全起见,可以检查是否grep
发现任何东西,如果没有发现,则给出警告/错误,以避免类似
\def\numofline{}
我知道这有点复杂,但它确实有效,节省了我很多时间。我建议将该脚本保存在与.tex
文件相同的文件夹中,并使用绝对路径grep
。