使用 Latex \label 命名外部文件?

使用 Latex \label 命名外部文件?

我正在编写一个包含定理和示例的 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}

在此处输入图片描述

相关内容