背景
希望对文件和目录名称应用一致的样式。本书的附录为本书引用的每个文件都提供了一个子部分。每个子部分都有一个标签,其值就是该子部分的标签。这样,更改标签将相应地更改整本书的所有引用。
问题
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
是引用当前上下文中的文件名的一个不错的选择,因为您不仅可以获得文件名,还可以获得指向相应子节标题的超链接。
输出结果为: