Латекс \@author С ifthenelse

Латекс \@author С ifthenelse

Я пытаюсь использовать следующий код:

\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}

Связанный контент