我正在编写一个包含定理和示例的 latex 文档。一些示例引用了外部 Matlab 脚本。我目前正在通过为 Matlab 脚本命名来实现引用,然后将此名称插入到我的 latex 文档中。例如,
示例 1:在 Matlab 脚本中Matlab脚本的名称.m我们验证了\autoref{theorem1}中的公式。
如果我想根据给定的定理找到一个 Matlab 脚本,这种引用是可以的,但当我想找到对应于给定 Matlab 脚本的定理时,这种引用就比较麻烦了。
我想知道是否可以让 Latex 根据 \label 为外部文件命名。继续这个例子,而不是调用文件Matlab脚本的名称.m它可以被称为\autoref{定理1}matlab脚本名称.m
答案1
使用参考值-package 您可以引入引用属性,通过它您可以使用文件名作为引用标签的别名,反之亦然,引用标签作为文件名的别名。
下面的例子中\labelAssignedToFilename
引入了宏,它既放置引用标签又创建别名。
\labelnametofilename
当您希望获取与引用标签相关的文件名时,可以使用宏。
\filenametolabelname
当您希望获取与文件名相关的引用标签时,可以使用该宏。
请注意,我通过实现了文件名的处理\detokenize
,这相当草率:\detokenize
双倍哈希值。
除此之外,处理带有不匹配的花括号或连续空格的文件名也可能会出现问题。
要正确处理文件名,您可能需要一种机制,让您可以在 verbatim-catcode-régime 下读取和写入参数/文件名,在写入 .aux 文件时保留分隔的逐字字符,然后使用相同的分隔符从那里逐字读取。(目前,xparse 及其良好的 v/+v 参数类型不允许您保留分隔的逐字字符...)
反过来,这种机制不能轻易地与 zref 机制保持一致——您需要实现自己的并行交叉引用基础设施来交叉引用逐字参数。
这是可行的,但代码量太大了。只有真正需要时我才会这么做。;-)
作为起点,这里有一个快速而简单的方法:
\documentclass{article}
\usepackage{hyperref, zref}
\makeatletter
\zref@newprop{filename}[\nfss@text{\reset@font\bfseries??}]{}
\zref@newprop{labelname}[]{}
\newcommand\labelAssignedToFilename[2]{%
\@bsphack
\zref@setcurrent{labelname}{#1}%
\zref@setcurrent{filename}{\string\detokenize{#2}}%
\@esphack
\ifhmode\nobreak\hskip-\@savsk\nobreak\hskip\@savsk\fi
\label{#1}%
\ifhmode\nobreak\hskip-\@savsk\nobreak\hskip\@savsk\fi
\zref@labelbyprops{labelname@#2}{labelname}%
\ifhmode\nobreak\hskip-\@savsk\nobreak\hskip\@savsk\fi
\zref@labelbyprops{filename@#1}{filename}%
}%
\newcommand\labelnametofilename[1]{%
\zref@refused{filename@#1}%
\zref@extract{filename@#1}{filename}%
}%
\newcommand\filenametolabelname[1]{%
\zref@extract{labelname@#1}{labelname}%
}%
\makeatother
\newtheorem{theorem}{Theorem}
\begin{document}
\begin{theorem}\labelAssignedToFilename{Thm1}{matlab_script_A.m}
If anything just cannot go wrong, it will anyway.
\end{theorem}
\begin{theorem}\labelAssignedToFilename{Thm2}{matlab_script_B.m}
Being paranoid doesn't mean they are not after you.
\end{theorem}
\begin{theorem}\labelAssignedToFilename{Thm3}{matlab_script_C.m}
Experience varies directly with equipment ruined.
\end{theorem}
\begin{theorem}\labelAssignedToFilename{Thm4}{matlab_script_D.m}
When working toward the solution of a problem, it always helps if you know the answer.
\end{theorem}
\ref{Thm1}=\ref{\filenametolabelname{matlab_script_A.m}}
\ref{Thm2}=\ref{\filenametolabelname{matlab_script_B.m}}
\ref{Thm3}=\ref{\filenametolabelname{matlab_script_C.m}}
\ref{Thm4}=\ref{\filenametolabelname{matlab_script_D.m}}
\texttt{\labelnametofilename{Thm1}}
\texttt{\labelnametofilename{Thm2}}
\texttt{\labelnametofilename{Thm3}}
\texttt{\labelnametofilename{Thm4}}
\end{document}