如何建立一個操作作者姓名的巨集?

如何建立一個操作作者姓名的巨集?

我想創建一個宏,它可以獲取通常在宏中聲明的姓名作者的信息\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}

處理前五種情況相當簡單。案例 6 需要建立所有語言中所有多詞姓氏的知識。處理案例 7 是可能的,但很乏味。當然,還有進一步的問題,因為某些語言(例如普通話)以相反的順序書寫名稱,即姓氏在前。

忽略所有這些問題,下面的程式碼定義了一個\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}

這個想法很簡單:使用乳膠3 常用表達將作者姓名拆分為空格,然後將最後一個「名稱」設為姓氏,將任何剩餘的名字設為名字,之後剩下的任何內容都將成為中間名。該\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}

這段程式碼準確地產生了所希望的答案。

在此輸入影像描述

相關內容