设置类以拥有可跨文档使用的变量

设置类以拥有可跨文档使用的变量

我知道我可以像这样创建一个新命令:

 \newcommand{\myname}{John Doe}

\myname然后会显示“John Doe”,但是我希望能够做一些更动态的事情,比如休闲

\newcomand{\name[2]}{@firstname}{@secondname}
\newcomand{\makename}{\name}

所以我想要\name{John}{Doe}“保存变量”然后\makename显示名称“John Doe”。

答案1

你可能

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand{\setname}[2]{%
  \gdef\@firstname{#1}% First name
  \gdef\@lastname{#2}% Last name
}
\newcommand{\printname}{%
  \ifdef{\@firstname}{\ifdefempty{\@firstname}{}{\@firstname\ }}{}%
  \ifdef{\@lastname}{\ifdefempty{\@lastname}{\unskip}{\@lastname}{}}{}}
\makeatother

\begin{document}
My name is \printname.

\setname{John}{Doe}%
My name is \printname.

\setname{}{Cares}%
My name is \printname.

\setname{Jane}{}%
My name is \printname.
\end{document}

上述方法与 非常相似\title\author\date强制执行标题。进行了一些检查以确保空元素不会插入不必要的空格。

答案2

你可以有任意多个名字;\name如果调用宏时没有可选参数,则宏将定义\firstname\secondname并且\printname;如果调用如下

\name[suffix]{A}{B}

将定义\firstnamesuffix\secondnamesuffix\printnamesuffix

例子:

\documentclass{article}
\usepackage[T1]{fontenc}% for printing |
\usepackage{etoolbox}

\newcommand{\name}[3][]{%
  \csgdef{firstname#1}{#2}%
  \csgdef{secondname#1}{#3}%
  \csxdef{printname#1}{%
    \ifblank{#3}%
      {\unexpanded{#2}}%
      {\ifblank{#2}{\unexpanded{#3}}{\unexpanded{#2 #3}}%
    }%
  }%
}

\begin{document}

\name{John}{Doe}

|\printname|\firstname|\secondname|

\name[p]{Plato}{}

|\printnamep|\firstnamep|\secondnamep|

\name[x]{}{\'X}

|\printnamex|\firstnamex|\secondnamex|

\end{document}

在此处输入图片描述

答案3

你需要的是 TeX 的基本原理。它能够定义和重新定义宏。

\def\makename{}
\def\name#1#2{\def\makename{#1 #2}}

Now, \makename\ is empty.
\name{John}{Doe}
Now, \makename\ expands to the declared name.

相关内容