我想\maketitle
在基于 的新文档类中修改命令memoir
。\maketitle
命令应包含类似于作者的新\director
命令。如果此命令在文本文件中定义,则标题中包含单词 Director(或 Directors)后跟导演姓名,但如果未定义,则不应出现任何内容。
下一个代码是以下答案的组合如何统计一篇文档的作者数量?和
如何创建类似于 \author 的新命令对于第二个答案,项目主管的姓名将通过命令添加到标题中\maketitle
;对于第一个答案,将根据命令 \and
中出现的命令选择 Director 或 Directors 字样。\director
问题是,如何测试是否不使用命令 \director 以避免出现“Director”。我知道如何添加,\newif\director
但不知道在哪里设置和使用。
\documentclass{memoir}% http://ctan.org/pkg/memoir
\makeatletter
\newcommand{\director}[1]{\gdef\@director{#1}}%
\newcommand{\@director}{\@latex@warning@no@line{No \noexpand\director given}}
\addtoiargdef{\director}{%
\begingroup\let\footnote\@gobble}{%
\begingroup
\renewcommand{\thanks}[1]{}
\renewcommand{\and}{\unskip, }
\renewcommand{\andnext}{\unskip, }
\renewcommand{\thanksmark}[1]{}
\renewcommand{\thanksgap}[1]{}
\protected@xdef\thedirector{#1}
\endgroup\endgroup}
\newcommand{\predirector}[1]{\def\@bspredirector{#1}}
\newcommand{\postdirector}[1]{\def\@bspostdirector{#1}}
\renewcommand{\maketitlehookc}{%
{\@bspredirector \@director \@bspostdirector}%
}
\predirector{\begin{center}
\large \lineskip .5em%
\printdirector\par
\begin{tabular}[t]{c}}
\postdirector{\end{tabular}\par\end{center}}
\newcommand\testdirector{%
\expandafter\tst@dir\@director\and\nil%
}
\def\tst@dir#1\and#2\nil{%
\edef\test{#2}%
\ifx\test\@empty Director\else Directors\fi%
}
\newcommand\printdirector{%
{%
\protected\def\and{and }%
\large \testdirector\par}
}
\makeatother
\title{A Title}
\author{An Author \and Another Author}
%\director{My Director \and My other Director}
%\director{My Director}
\date{\today}
\begin{document}
\maketitle
\end{document}
答案1
由于\director
似乎是可选的,所以说
\let\@director\@empty
代替
\newcommand{\@director}{\@latex@warning@no@line{No \noexpand\director given}}
然后尝试
\renewcommand{\maketitlehookc}{%
\ifx\@director\@empty
\else{\@bspredirector \@director \@bspostdirector}%
\fi}
因此,如果\director
尚未发出命令,则测试将为真并且\else
将跳过该部分。
答案2
如果\director
是可选的,那么你不想
\newcommand{\@director}{\@latex@warning@no@line{No \noexpand\director given}}
你只是想要
\newcommand{\@director}{}
然后(或多或少)您不需要测试任何东西,只需使用\@director
,它将是作者提供的名称或什么都没有。您可能需要使其更复杂一些,具体取决于您想要在默认(空)情况下在导演前后做什么。我不清楚这一点。但您可以例如将所有三个内部命令都设为空,并让导演定义前后命令以使用一些间距。所以再说一次,不需要测试。