在 \path 中使用 \nameref

在 \path 中使用 \nameref

背景

希望对文件和目录名称应用一致的样式。本书的附录为本书引用的每个文件都提供了一个子部分。每个子部分都有一个标签,其值就是该子部分的标签。这样,更改标签将相应地更改整本书的所有引用。

问题

URL 包中的命令\path{}接受一个参数并应用其样式,同时考虑反斜杠。例如,以下内容按预期工作:

\path{cities.jsp}

理想的情况是:

\path{\nameref{sub:cities.jsp}}

这将输出\nameref{sub:cities.jsp}到文档中,而不是所需的值cities.jsp

这样做的目的是,如果我改变了文件名的想法,我只需将标签“sub:cities.jsp”更改为“sub:city.jsp”,这样整个文档现在就引用了“city.jsp”。我使用了一个子部分,这样就可以自动应用超链接。

问题

如何在将参数传递给\path{}之前先扩展的参数添加到?也就是说,我该如何编写以下内容:\nameref\path{}

\filename{sub:cities.jsp}

并且它是否变成了:

\path{cities.jsp}

我尝试了许多变体,但我不明白如何使用expandafter带参数的命令(而且expandafter我能找到的最简单的示例对我来说都是拉丁语)。我还想保持命令\path不变(因为我将其用于目录名,而不是文件名),并添加一个新命令\filename,通过相应的子节引用文件。序言中的示例:

尝试 #1

% \newcommand{\filename}[1]{\path{#1}}
% \expandafter\filename\path
\expandafter\def\filename#1{\nameref{#1}} \path

第一行给了我\filename命令,但是直到查看它才展开参数\path,这并不奇怪。

第二行失败,因为没有考虑参数,也没有\nameref

第三行产生“未定义的控制序列”错误。

尝试#2

\def \filename #1{\nameref{#1}}
\expandafter\def\filename \path

有关的

答案1

所以,您的意图是:只在一个地方放置文件名。如果需要,您只需在此处进行更改。这非常好!但是,我不会在文档正文中为此类地方选择子节标题。

我建议在序言中的某个地方定义所有文件名的宏。

完成此操作后,你可以轻松使用。此外,我猜使用引用命令(例如或 )\expandafter可能会更难。使用普通宏很容易。例如\expandafter\nameref\autoref

\newcommand*{\expath}[1]{\expandafter\path\expandafter{#1}}

\path使用扩展文件名变量作为参数进行调用。

完整的最小示例:

\documentclass{article}
\usepackage{url}
\newcommand*{\filecities}{cities.jsp}
\newcommand*{\expath}[1]{\expandafter\path\expandafter{#1}}
\begin{document}
\tableofcontents
\section{Test}
\subsection{\filecities}
The file name is \expath{\filecities}.
\end{document}

替代文本

如果文件名有变化,修改即可\filecities

我曾经测试过同样的扩展方式,\nameref但是没有效果 - 但无论如何我不会依赖正文标题中的定义,对于这样的工作我依赖序言。

答案2

我将采取一种更为强大的方法,使用包\urldef的宏url来定义文件名宏:

\documentclass{article}

\usepackage{hyperref}

\urldef\citiesjsp\path{cities.jsp}

\begin{document}

\tableofcontents

\section{A Section}

\subsection{\citiesjsp}
\label{sub:citiesjsp}

The filename is \nameref{sub:citiesjsp}.

\end{document}

请注意,用 定义的宏\urldef非常强大。因此,它们可以顺利地用于移动参数(例如在 的参数中\subsection)。此外,我认为这\nameref是引用当前上下文中的文件名的一个不错的选择,因为您不仅可以获得文件名,还可以获得指向相应子节标题的超链接。

输出结果为:

相关内容