有没有办法定义一个仅输出其参数首字母的命令或宏?
例如:我的名字是 Joaquim Brasil。我可以定义一个宏\def\WhatIsYourName#1{\@WhatIsYourName{#1}}
来存储我的名字,并定义另一个宏\def\MyNameIs{\@WhatIsYourName}
来打印我的名字Joaquim Brasil
,只要我\MyNameIs
在文件正文中输入了tex
这些名字。但是,有时我需要打印,B., Joaquim
因为这是我的签名。
所以,我的问题是:有没有办法定义一个命令,比如\MySignatureIs
读取存储在中的值\MyNameIs
并以上面要求的方式输出签名?
答案1
实现这一点的一种方法是使用 指定输入的“形状” \def
。例如,如果你定义
\def\@setinitials#1#2@{\def\@initials{#1}}
然后使用,\@setinitials Joaquim@
当\@setinitials
展开时#1
设置为J
,并且设置为,因此#2
定义为。关键点是参数规范末尾的告诉 TeX 将设置为输入流中下一个字符之后的任何内容。当然,您不想“手动”使用该命令,因为您总是必须将字符放在末尾,但通过链接一系列这样的命令,您可以设置它,以便代码oaquim
\@initials
J
@
\@setinitials
#2
#1
@
\@setintials
@
\SetMyName{Joaquim Brasil}
My name is \MyName.
My abbreviated name is \myName.
My abbreviated surname is \Myname.
生产
完整代码如下:
\documentclass{article}
\makeatletter
\def\@firstname{} % initialise all name variants
\def\@firstnameInitial{}
\def\@surnameInitial{}
\def\@surname{}
\def\@setsurnameinitial#1#2@{\def\@surnameInitial{#1}}
\def\@setinitial#1#2@{\def\@firstnameInitial{#1}}
\def\@setmyname#1 #2@{% space separates #1 and #2 up to @
\def\@firstname{#1}% set first name
\def\@surname{#2}% set surname
\@setinitial#1@% set firstname initial
\@setsurnameinitial#2@% set surname initial
}
\newcommand\SetMyName[1]{\@setmyname #1@}
\newcommand\MyName{\@firstname\space\@surname}
\newcommand\myName{\@firstnameInitial.~\@surname}
\newcommand\Myname{\@surnameInitial.,~\@firstname}
\makeatother
\begin{document}
\SetMyName{Joaquim Brasil}
My name is \MyName.
My abbreviated name is \myName.
My abbreviated surname is \Myname.
\end{document}
最后要提醒的是,\SetMyName
如果给出的名称不包含空格(例如),此命令将会中断\SetMyName{Brasil}
。再多花点功夫,您也可以应对这种情况。如果名称包含字符,它也会中断@
。如果您想要真正强大的东西,那么我可能会改用使用LaTeX3。
答案2
这是一个可扩展的expl3
实现,可以处理中间名、单个名字并且不包含禁用字符 :-)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_brasil_name_seq
\NewDocumentCommand \WhatIsYourName { m }
{ \seq_gset_split:Nnn \g_brasil_name_seq { ~ } {#1} }
\NewExpandableDocumentCommand \MyNameIs { }
{ \seq_use:Nn \g_brasil_name_seq { ~ } }
\NewExpandableDocumentCommand \MySignatureIs { }
{
\__brasil_signature:ee
{ \seq_item:Nn \g_brasil_name_seq { 1 } }
{
\seq_use:Nn \g_brasil_name_seq { \s_stop } \s_stop
\exp_not:N \q_nil \s_stop
}
}
\cs_new:Npn \__brasil_signature:nn #1 #2
{
\exp_last_unbraced:No \__brasil_signature_aux:w
{ \use_none_delimit_by_s_stop:w #2 } #1
}
\cs_generate_variant:Nn \__brasil_signature:nn { ee }
\cs_new:Npn \__brasil_signature_aux:w #1 \s_stop
{
\quark_if_nil:nF {#1}
{ \tl_head:n {#1}.,~ \__brasil_signature_aux:w }
}
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}
\WhatIsYourName{Joaquim Brasil}
My name is \MyNameIs{} and my signature is \MySignatureIs.
\WhatIsYourName{Brasil}
My name is \MyNameIs{} and my signature is \MySignatureIs.
\WhatIsYourName{Joaquim Middle Name Brasil}
My name is \MyNameIs{} and my signature is \MySignatureIs.
\end{document}