我想编写一个宏来定义一些文本,例如标题。用户将像这样使用它:
\headertitle{Some header for a document}
我是这样写的:
\newcommand\Headertitle{Default header title}
\newcommand\headertitle[1]{\renewcommand\Headertitle{#1}}
它的用法fancyhead
如下:
\fancyhead[CO]{-\thepage- \\* \Headertitle}
一切都运行正常。如果用户不定义自己的标题,Default header title
则会进行设置。
有没有更有效的方法来编写这些宏,这样我就不会为一个命令创建两个名称(就像\Headertitle
我\headertitle
的例子中的那样?
答案1
有很多方法。下面是我定义两个数据宏的方法:\headertitledefault
用于默认标头和\theheadertitle
用于当前标头。然后是一个命令宏\setheadertitle
,它接受要设置的可选标头(如果未指定,则为默认值)。
但是,正如评论中指出的那样,实现这一点的“正确”方法不止一种。这取决于你如何看待它。
\documentclass{book}
\usepackage{fancyhdr,lipsum}
\newcommand\headertitledefault{Default header title}
\newcommand\setheadertitle[1][\headertitledefault]{\def\theheadertitle{#1}}
\setheadertitle
\pagestyle{fancy}
\begin{document}
\fancyhead[CO]{-\thepage- \\* \theheadertitle}
\section{Section}
\lipsum[1-6]
\clearpage
\setheadertitle[Some header for a document]
\lipsum[11-20]
\end{document}
答案2
您的方法与标准类对\title
和所做的基本相同\author
,因此我认为这已经是一个非常可靠的解决方案(参见§60.1标题,文件 F:,ltsect.dtx
第 386 页)。请注意,标准风格的方法与您的方法之间存在差异:您的定义\Headertitle
是局部的,而标准方法使用全局定义。
\Headertitle
如果您的用户不应该在文档的任何地方使用 的值,您可能需要考虑将@
其设为名称中包含 的“私有”宏。这还可以避免使用大写字母的内部名称,我不太喜欢这种名称(我更喜欢全小写的名称)。
您可以定义一个元宏来为您定义这两个命令。如果您预计必须定义几个这种通用形式的类似宏,那么这种方法很有吸引力,但如果您只将其用于一个命令(如在 MWE 中),则会产生不必要的混淆。
\documentclass{book}
\usepackage{fancyhdr,lipsum}
\makeatletter
% {<name>}{<default value>}
\newcommand*{\shalom@maketitlelikecommand}[2]{%
\expandafter\newcommand\csname shalom@#1\endcsname{#2}%
\expandafter\newcommand\csname #1\endcsname[1]{%
\expandafter\gdef\csname shalom@#1\endcsname{##1}}}
\shalom@maketitlelikecommand{headertitle}{Default header title}
\fancyhead[CO]{-\thepage- \\* \shalom@headertitle}
\makeatother
\headertitle{Loremm ipsum}
\pagestyle{fancy}
\begin{document}
\section{Section}
\lipsum[1-6]
\clearpage
\lipsum[11-20]
\end{document}
答案3
我建议不要这样做。你可以做的是将第二个宏定义为保留宏。
\documentclass{article}
\makeatletter
\newcommand{\headertitle}{%
\@ifnextchar\bgroup{\set@headertitle}{Default header title}%
}
\newcommand{\set@headertitle}[1]{\gdef\headertitle{#1}}
\makeatother
\begin{document}
\headertitle
\headertitle{Real title}
\headertitle
\end{document}
更好的方法是先\setheadertitle
在序言中使用宏,然后\headertitle
在文档中使用宏,先设置前者。