定义全局变量;错误!\@ 的使用与其定义不符

定义全局变量;错误!\@ 的使用与其定义不符

我想为我的 IPE 模板定义一些变量,例如标题、所属机构和作者等。代码如下所示。但是当我使用 编译它时pdflatex,它不会显示\def变量应有的结果。当我删除\makeatletter和 时\makeatother,它发出错误消息“! \@ 的使用与其定义不匹配。”

有什么解决办法吗?

\documentclass{article}
\usepackage{color}

\makeatletter
\def\title#1{\def\@title{#1}} % Title 
\def\displaytitle#1{\def\@displaytitle{#1}} % Display Title
\def\displayauthor#1{\def\@displayauthor{#1}} % Display author
\def\displayaffiliation#1{\def\@displayaffiliation{#1}} % Display affiliation
\makeatother

\title{This is a presentation}%
\displayauthor{Liu Benyuan}%
\displayaffiliation{The Automatic Target Recognition (ATR) Laboratory}%
\displaytitle{Compressive Sensing via Block Sparse Bayesian Learning : Theory and Applications}%

\begin{document}

\begin{minipage}{736pt}
\vspace*{.5em}
\begin{minipage}{650pt}\Large
\textcolor{red}{
{\bf \@displayauthor{}}~~$\cdot$~~{\bf \@displayaffiliation{}}~\hfill$\cdot$\hfill~{\bf NUDT}} \\
\textcolor{blue}{
\bf \@displaytitle{}\hfill \today{}}
\end{minipage}
\hspace*{8em}
\vspace*{.5em}
\end{minipage}

\end{document}

答案1

虽然您在创建定义时完美地使用了\makeatletter...\makeatother对,但如果您在其他地方引用这些定义,则需要执行相同的操作。因此,使用minipage另一个\makeatletter...\makeatother对“限定范围”可以解决您的问题。

作为参考,请参阅做什么\makeatletter\makeatother做什么?

其他一些注意事项:

  • 使用预定义长度,而不是绝对长度。也许使用\linewidth而不是736pt更合适。
  • 对于后端宏,@在定义中使用 是可以的。但是,如果您要在文档内容中使用定义,请避免使用包含 的宏@,或者为此构建用户界面。例如,

    \def\printtitle{\@title}% Display title
    \def\printdisplaytitle{\@displaytitle}% Display title
    \def\printdisplayauthor{\@displayauthor}% Display author
    \def\printdisplayaffiliation{\@displayaffiliation}% Display affiliation
    

    现在您可以使用

    \textbf{\printdisplayauthor}~~$\cdot$~~%
      \textbf{\printdisplayaffiliation}~\hfill$\cdot$\hfill~%
      \textbf{NUDT} \
    
  • 不要使用旧的字体开关,如\bf\it。请参阅\textit我使用或\it\bfseries等有关系吗\bf两个字母的字体样式命令(\bf,,\it...)会在 LaTeX 中复活吗?

相关内容