如何创建一个操作作者姓名的宏?

如何创建一个操作作者姓名的宏?

我想创建一个宏,该宏可以获取作者姓名的信息(通常在宏中声明)\author,并将其分解为三个部分:姓名、中间名和姓氏。为此,可以创建类型为 、 和 的内部宏\firstname\midlename然后\lastname,宏将能够获取此信息并以姓氏、名字和中间名的格式打印。例如,我可以声明姓名,\author{Alexsandro Lucena Mota}然后宏(例如\newauthorname)将在 pdf 文档中以 的形式打印姓名Mota, Alexsandro Lucena

注意:这个\newauthorname宏只是一个建议,也许不是最好的。这里,目的是在参考书目引文中引用作者的名字,但采用上面提供的示例形式,即。Mota, Alexsandro Lucena也许这个宏的更好名称是\authornameinbibliographycitation,但是,它肯定很长。请随意提出您的建议。

是否有任何已知的包或宏可以做到这一点?

可能仍有人会问:“你为什么需要这个?”

在巴西,在论文和学位论文的封面后面,我们必须告知目录数据,如下例所示。

在此处输入图片描述

因此,我希望 LaTeX 按照上图示例的格式打印作者的姓名。

但有人可能还是会问:为什么不手写呢?

答案是我想要创建一个包,这样用户只需要担心在宏中输入他的名字\author,而 LaTeX 会处理剩下的事情,并自动生成文件。

最后,有人会要求提供一个最少的样品,并因此遵循品尝准则。

\documentclass[12pt,a4paper]{memoir}
\usepackage{lastpage}
\title{Ficha catalográfica: um exemplo mínimo.}
\author{Alexsandro Lucena Mota}
\date{2020}
\begin{document}
\thispagestyle{empty}\null\vfill%

\begin{SingleSpacing}   
    \begin{center}
        \begin{minipage}[c][][c]{13.5cm}
            \begin{center}
                {\small Ficha gerada por meio do SIGAA/Biblioteca 
                com dados fornecidos pelo
                    autor.}%
                {\small N\'ucleo Integrado de Bibliotecas/UFMA}%
            \end{center}
        \end{minipage}
        %      
        \begin{tabular}
            [c]{|c|}\hline
            \begin{minipage}[c][7.8cm][c]{13.1cm}%
                \begin{adjustwidth}{0.5cm}{0.0cm}%
                    \texttt{Mota, Alexsandro 
                    Lucena}\newline\texttt{\hspace*{0.55cm}\thetitle/
                        \theauthor. -- \thedate} 
                        \newline\texttt{\hspace*{0.55cm}\pageref{LastPage}
                        p.} 
                        \newline\newline\texttt{\hspace*{0.55cm}Orientador:
                         Prof. Dr. Fulando
                        Beltrano Silva Sauro.} 
                        \newline\hspace{0.55cm}\texttt{Tese
                        (doutorado)~--~Programa de Pós-Graduação em 
                        Física/ccet, Universidade Federal
                        do Maranhão, São Luís, 
                        \thedate.}\newline\newline\texttt{\hspace*{0.55cm}1.
                        Ficha Catalográfica.~2. Exemplo Mínimo.~3. 
                        LaTeX.~4. PDFLaTeX~I. Sauro, Fulando 
                        Beltrano 
                        Silva.~II. Título}
                \end{adjustwidth}%
            \end{minipage}%
            \\\hline
        \end{tabular}        
    \end{center}
\end{SingleSpacing}

\end{document}

上面的代码产生

在此处输入图片描述

因此,我希望我已经提供了足够的信息来指导可能的反应。

答案1

我发现,提供从中提取隐含信息的命令存在的问题在于\author,有太多极端情况无法正确处理。理想情况下,它应该能够正确处理以下每个用例:

  • \author{Alexsandro Lucena Mota}
  • \author{Doe}
  • \author{Jane Doe}
  • \author{Jane Maria Doe}
  • \author{Jane Maria Ellen Doe}
  • \author{Jane Maria de Lucca}
  • \author{Mota, Alexsandro Lucena}

处理前五种情况相当简单。第六种情况需要了解所有语言中所有多词姓氏。处理第七种情况是可能的,但很繁琐。当然,还存在其他问题,因为有些语言(如普通话)以相反的顺序书写姓名,姓氏在前。

忽略所有这些问题,下面的代码定义了一个\Author命令,它设置\firstname\middlename并且\lastname还将其参数传递给\author命令。如下图所示,它适用于案例 1-6,其中案例 6 需要通过添加 来获得少量额外帮助~。该\Author命令与案例 7 配合不佳。

在此处输入图片描述

以下是代码:

\documentclass[12pt,a4paper]{memoir}
\parindent0pt

\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \g_firstname_tl
\tl_new:N \g_middlename_tl
\tl_new:N \g_lastname_tl
\seq_new:N \l_author_names_seq
\NewDocumentCommand\Author{m}{
  \author{#1}
  % clear the  first, middle and last token lists
  \tl_clear:N \g_firstname_tl
  \tl_clear:N \g_middlename_tl
  \tl_clear:N \g_lastname_tl
  % trim spaces and split the author name(s) on surrounding spaces
  \regex_split:nxN {\s+} { \tl_trim_spaces:n {#1} } \l_author_names_seq
  \int_case:nnF {\seq_count:N \l_author_names_seq }
  {
  {0} {}
  {1} {\seq_pop_left:NN \l_author_names_seq \g_lastname_tl }
  {2} {
          \seq_pop_left:NN \l_author_names_seq \g_firstname_tl
          \seq_pop_left:NN \l_author_names_seq \g_lastname_tl
      }
  }
  {
    \seq_pop_left:NN \l_author_names_seq \g_firstname_tl
    \seq_pop_right:NN \l_author_names_seq \g_lastname_tl
    \tl_gset:Nx \g_middlename_tl { \seq_use:Nn \l_author_names_seq {\space} }
  }
}
\cs_generate_variant:Nn \regex_split:nnN { nxN }

\NewDocumentCommand\firstname{}{\tl_use:N\g_firstname_tl}
\NewDocumentCommand\middlename{}{\tl_use:N\g_middlename_tl}
\NewDocumentCommand\lastname{}{\tl_use:N\g_lastname_tl}
\NewDocumentCommand\fullauthor{}{\lastname,\space\firstname\space\middlename}
\ExplSyntaxOff

\newcommand\Names[1]{\Author{#1}\textsf{Author:} #1.\newline \textit{First}: \firstname, \textit{Middle}: \middlename, \textit{Last}: \lastname.\par\medskip}

\begin{document}

\Names{Alexsandro Lucena Mota}
\Names{Doe}
\Names{Jane Doe}
\Names{Jane Maria Doe}
\Names{Jane Maria Ellen Doe}
\Names{Jane Maria de~Lucca}

\textbf{Fails}:

\Names{Mota, Alexsandro Lucena}

\end{document}

这个想法很简单:使用LaTeX3 常用表达将作者姓名用空格分开,然后将最后一个“名字”设置为姓氏,将剩余的名字设置为名字,之后剩下的任何名字都将成为中间名。该\Names宏只是一个辅助宏,用于显示其\Author作用。

代码提供了一个\fullauthor打印的命令last name, first name middle name。我没有调用这个命令\newauthorname,因为对我来说,这听起来像是你将用来定义作者,不得打印。

编辑

根据评论中的要求,这里有一个小的变体,它重新定义了\author命令,而不是定义新\Author命令。如果要经常使用,可以将序言中的代码放入样式文件中,然后fullauthor.sty包含在 中\usepackage{fullauthor}

\documentclass[12pt,a4paper]{article}
\parindent0pt
\let\realAuthor\author

\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \g_firstname_tl
\tl_new:N \g_middlename_tl
\tl_new:N \g_lastname_tl
\seq_new:N \l_author_names_seq
\renewcommand\author[1]
{
  \realAuthor{#1}
  % clear the  first, middle and last token lists
  \tl_clear:N \g_firstname_tl
  \tl_clear:N \g_middlename_tl
  \tl_clear:N \g_lastname_tl
  % trim spaces and split the author name(s) on surrounding spaces
  \regex_split:nxN {\s+} { \tl_trim_spaces:n {#1} } \l_author_names_seq
  \int_case:nnF {\seq_count:N \l_author_names_seq }
  {
  {0} {}
  {1} {\seq_pop_left:NN \l_author_names_seq \g_lastname_tl }
  {2} {
          \seq_pop_left:NN \l_author_names_seq \g_firstname_tl
          \seq_pop_left:NN \l_author_names_seq \g_lastname_tl
      }
  }
  {
    \seq_pop_left:NN \l_author_names_seq \g_firstname_tl
    \seq_pop_right:NN \l_author_names_seq \g_lastname_tl
    \tl_gset:Nx \g_middlename_tl { \seq_use:Nn \l_author_names_seq {\space} }
  }
}
\cs_generate_variant:Nn \regex_split:nnN { nxN }

\NewDocumentCommand\firstname{}{\tl_use:N\g_firstname_tl}
\NewDocumentCommand\middlename{}{\tl_use:N\g_middlename_tl}
\NewDocumentCommand\lastname{}{\tl_use:N\g_lastname_tl}
\NewDocumentCommand\fullauthor{}{\lastname,\space\firstname\space\middlename}
\ExplSyntaxOff

\newcommand\Names[1]{\author{#1}\textsf{Author:} #1.\newline \textit{First}: \firstname, \textit{Middle}: \middlename, \textit{Last}: \lastname.\par\medskip}

\author{Alexsandro Lucena Mota}     % using the new \author command in the preamble

\begin{document}

\fullauthor

\Names{Alexsandro Lucena Mota}
\Names{Doe}
\Names{Jane Doe}
\Names{Jane Maria Doe}
\Names{Jane Maria Ellen Doe}
\Names{Jane Maria de~Lucca}

\textbf{Fails}:

\Names{Mota, Alexsandro Lucena}

\end{document}

答案2

在这里,我提供了一个答案——基于@Andrew 给出的上述答案中的代码的示例。

\documentclass[12pt,a4paper]{memoir}
\parindent0pt

\usepackage{lastpage}
\usepackage{xparse}

\let\realAuthor\author

\usepackage{xparse}
\ExplSyntaxOn
%\let\__real_author:n \author
\tl_new:N \g_firstname_tl
\tl_new:N \g_middlename_tl
\tl_new:N \g_lastname_tl
\seq_new:N \l_author_names_seq
\renewcommand\author[1]
{
    %\realAuthor{#1}
    % clear the  first, middle and last token lists
    \tl_clear:N \g_firstname_tl
    \tl_clear:N \g_middlename_tl
    \tl_clear:N \g_lastname_tl
    % trim spaces and split the author name(s) on surrounding spaces
    \regex_split:nxN {\s+} { \tl_trim_spaces:n {#1} } 
    \l_author_names_seq
    \int_case:nnF {\seq_count:N \l_author_names_seq }
    {
        {0} {}
        {1} {\seq_pop_left:NN \l_author_names_seq \g_lastname_tl }
        {2} {
            \seq_pop_left:NN \l_author_names_seq \g_firstname_tl
            \seq_pop_left:NN \l_author_names_seq \g_lastname_tl
        }
    }
    {
        \seq_pop_left:NN \l_author_names_seq \g_firstname_tl
        \seq_pop_right:NN \l_author_names_seq \g_lastname_tl
        \tl_gset:Nx \g_middlename_tl { \seq_use:Nn 
        \l_author_names_seq {\space} }
    }
}
\cs_generate_variant:Nn \regex_split:nnN { nxN }

\NewDocumentCommand\firstname{}{\tl_use:N\g_firstname_tl}
\NewDocumentCommand\middlename{}{\tl_use:N\g_middlename_tl}
\NewDocumentCommand\lastname{}{\tl_use:N\g_lastname_tl}
\NewDocumentCommand\theauthor{}{ 
\firstname\space\middlename\space\lastname}
\NewDocumentCommand\fullauthor{}{\lastname, 
\space\firstname\space\middlename}
\ExplSyntaxOff

\title{Ficha catalográfica: um exemplo mínimo.}
\author{Alexsandro Lucena Mota}    % using the new \author command 
%in the preamble
\date{2020}
\begin{document}
    \thispagestyle{empty}\null\vfill%
    \theauthor\par\fullauthor
    \begin{SingleSpacing}   
        \begin{center}
            \begin{minipage}[c][][c]{13.5cm}
                \begin{center}
                    {\small Ficha gerada por meio do 
                    SIGAA/Biblioteca  
                        com dados fornecidos pelo autor.\par% 
                        N\'ucleo Integrado de Bibliotecas/UFMA}%
                \end{center}
            \end{minipage}
            %      
            \begin{tabular}
                [c]{|c|}\hline
                \begin{minipage}[c][7.8cm][c]{13.1cm}%
                    \begin{adjustwidth}{0.5cm}{0.0cm}%
                        \texttt{\fullauthor}\newline\texttt{\hspace*{0.55cm}\thetitle/
                            \theauthor. -- \thedate} 
                        \newline\texttt{\hspace*{0.55cm}\pageref{LastPage}
                            p.} 
                        \newline\newline\texttt{\hspace*{0.55cm}Orientador:
                            Prof. Dr. Fulando
                            Beltrano Silva Sauro.} 
                        \newline\hspace{0.55cm}\texttt{Tese
                            (doutorado)~--~Programa de 
                            Pós-Graduação em 
                            Física/ccet, Universidade Federal
                            do Maranhão, São Luís, 
                            \thedate.}\newline\newline\texttt{\hspace*{0.55cm}1.
                            Ficha Catalográfica.~2. Exemplo 
                            Mínimo.~3. 
                            LaTeX.~4. PDFLaTeX~I. Sauro, Fulando 
                            Beltrano 
                            Silva.~II. Título}
                    \end{adjustwidth}%
                \end{minipage}%
                \\\hline
            \end{tabular}        
        \end{center}
    \end{SingleSpacing}
    
\end{document}

这段代码给出了我们所期望的答案。

在此处输入图片描述

相关内容