定义宏的更有效的方法

定义宏的更有效的方法

我想编写一个宏来定义一些文本,例如标题。用户将像这样使用它:

\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 中),则会产生不必要的混淆。

史蒂文·B·塞格莱特斯平均能量损失

\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在文档中使用宏,先设置前者。

相关内容