Я пытаюсь использовать следующий код:
\documentclass{article}
\makeatletter
\def\@maketitle{%
\newpage
\null
\begin{center}%
\let \footnote \thanks
{\Large \MakeUppercase{\@title} \par}%
\ifthenelse{\equal{\@author}{}}{no author}%
{\vskip 1.5em\textsc{\setstretch{1.32}\@author\\\hfill}\par}%
\end{center}
\par
\vskip 4em\noindent}
\begin{document}
\maketitle
\end{document}
Однако он не компилируется. Изъятие \ifthenelse
работает (можно проверить, поставив %
перед ним ), но мне действительно нужно иметь его. Ошибка следующая:
/tmp/gummi_V2UOCX:32: Use of \@item doesn't match its definition.
\@ifnextchar ... \reserved@d =#1\def \reserved@a {
#2}\def \reserved@b {#3}\f...
l.32 \maketitle
решение1
Пара проблем:
Вы используете
\ifthenelse
, что требуетifthen
упаковка(илиxifthen
).То же самое касается и
\setstretch
того, что требуетsetspace
.
Однако, более серьезной проблемой является проверка на предмет того, \@author
является ли пустым {}
. Классы документов LaTeX по умолчанию \@author
определяютнетбыть пустым, даже если \author
указано no. Фактически, если \author
указано no, \@author
выглядит так (изlatex.ltx
):
\def\author#1{\gdef\@author{#1}}
\def\@author{\@latex@warning@no@line{No \noexpand\author given}}
\author
просто переопределяет \@author
, чтобы содержать имя автора, в противном случае вывод по умолчанию — предупреждение No \author given
. Следующийтолькоизменяет эту часть, так как я не уверен, что вы хотите сделать с остальной частью форматирования заголовка:
\documentclass{article}
\usepackage{setspace}% http://ctan.org/pkg/setspace
\makeatletter
\let\@emptyauthor\@author
\def\@maketitle{%
\newpage
\null
\begin{center}%
\let \footnote \thanks
{\Large \MakeUppercase{\@title} \par}%
\ifx\@author\@emptyauthor
no author%
\else% \author is supplied
\vskip 1.5em\textsc{\setstretch{1.32}\@author\\\hfill}\par
\fi%
\end{center}
\par
\vskip 4em\noindent}
\makeatother
\title{A title}
\begin{document}
\maketitle
\end{document}
Идея заключается в том, чтобы зафиксировать то, что \@author
выглядит в начале вашей преамбулы. Затем вы можете точно проверить определения макросов и выполнить ветвление/условие соответственно. \@emptyauthor
сохраняет \@author
без каких-либо изменений, а текст \ifx\@author\@emptyauthor <true/no author> \else <false/author> \fi
предоставляет условие.
Однако было бы проще уточнить \author{no author}
... на самом деле.
Для добавления даты в качестве еще одного разветвленного вывода можно использовать
\makeatletter
\def\ifemptyarg#1{% http://tex.stackexchange.com/q/308/5764
\if\relax\detokenize{#1}\relax % H. Oberdiek
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\let\@emptyauthor\@author
\def\@maketitle{%
\newpage
\null
\begin{center}%
\let \footnote \thanks
{\Large \MakeUppercase{\@title} \par}%
\ifx\@author\@emptyauthor
no author%
\else% \author is supplied
\vskip 1.5em\textsc{\setstretch{1.32}\@author\\\hfill}\par
\fi%
\par\expandafter\ifemptyarg\expandafter{\@date}{no date}{\@date}%
\end{center}
\par
\vskip 4em\noindent}
\makeatother
в вашей преамбуле.
\title{A title}
\date{}
\begin{document}
\maketitle
\end{document}