我知道我可以像这样创建一个新命令:
\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.