如何测试.tex 文件中是否使用了一些类似于 \author 的命令?

如何测试.tex 文件中是否使用了一些类似于 \author 的命令?

我想\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,它将是作者提供的名称或什么都没有。您可能需要使其更复杂一些,具体取决于您想要在默认(空)情况下在导演前后做什么。我不清楚这一点。但您可以例如将所有三个内部命令都设为空,并让导演定义前后命令以使用一些间距。所以再说一次,不需要测试。

相关内容