定义一个命令,打印其输入参数的首字母

定义一个命令,打印其输入参数的首字母

有没有办法定义一个仅输出其参数首字母的命令或宏?

例如:我的名字是 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\@initialsJ@\@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}

相关内容