¿Cómo crear una macro que manipule el nombre del autor?

¿Cómo crear una macro que manipule el nombre del autor?

Me gustaría crear una macro que pudiera tomar la información del nombre del autor, generalmente declarada en la macro \author, y dividirla en tres partes: nombre, segundo nombre y apellido. Para ello se podrían crear macros internas del tipo \firstname, \midlename, y . \lastnameLa macro luego podría tomar esta información e imprimirla en el formato apellido, nombre y segundo nombre. Por ejemplo, podría declarar el nombre \author{Alexsandro Lucena Mota}y la macro, digamos \newauthorname, imprimiría en un documento pdf el nombre en el formulario Mota, Alexsandro Lucena.

Nota: la \newauthornamemacro fue solo una sugerencia que, quizás, no fue la mejor. Aquí, la intención es hacer referencia al nombre del autor en las citas bibliográficas, pero en la forma del ejemplo proporcionado anteriormente, es decir, Mota, Alexsandro Lucena. Quizás un mejor nombre para esta macro sería \authornameinbibliographycitation, sin embargo, ciertamente es muy largo. No dudes en hacer tus sugerencias.

¿Existen paquetes o macros conocidos que sean capaces de hacer esto?

Es posible que alguien todavía pregunte: "¿Por qué necesitas esto?"

En Brasil, en tesis y disertaciones, detrás de la portada, debemos informar los datos del catálogo como en el ejemplo siguiente.

ingrese la descripción de la imagen aquí

Entonces, me gustaría que LaTeX imprima el nombre del autor en el formato del ejemplo de la figura anterior.

Pero todavía alguien podría preguntar: ¿Por qué no escribes a mano?

Y la respuesta es que me gustaría crear un paquete para que el usuario sólo se preocupara de escribir su nombre en la macro \authory LaTeX se encargara del resto generando el archivo automáticamente.

Y finalmente, alguien pedirá un ejemplo mínimo y, por ello, seguirá un código para la cata.

\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}

El código anterior produce

ingrese la descripción de la imagen aquí

Espero, por tanto, haber proporcionado suficiente información para orientar posibles respuestas.

Respuesta1

El problema que veo al proporcionar comandos que extraen información implícita es \authorque hay demasiados casos extremos para hacerlo bien. Idealmente, debería hacer frente correctamente a cada uno de los siguientes casos de uso:

  • \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}

Manejar los primeros cinco casos es bastante sencillo. El caso 6 requiere desarrollar el conocimiento de todos los apellidos de varias palabras en todos los idiomas. Sería posible afrontar el Caso 7, pero tedioso. Por supuesto, existen más problemas porque algunos idiomas, como el mandarín, escriben los nombres en orden inverso, con el apellido primero.

Haciendo caso omiso de todos estos problemas, el siguiente código define un comando \Authorque establece \firstnamey también pasa su argumento al comando. Como muestra la imagen a continuación, atiende a los Casos 1-6, y el Caso 6 requiere una pequeña cantidad de ayuda adicional mediante la adición de un archivo . El comando no funciona bien con el Caso 7.\middlename\lastname\author~\Author

ingrese la descripción de la imagen aquí

Aquí está el código:

\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}

La idea es bastante simple: usarLátex3 expresiones regularespara dividir los nombres de los autores en los espacios y luego establecer el último "nombre" como apellido, cualquier nombre restante como primer nombre, después de lo cual todo lo que quede se convierte en el segundo nombre. La \Namesmacro es sólo una macro auxiliar para mostrar lo que \Authorhace.

El código proporciona un \fullauthorcomando que imprime last name, first name middle name. Yo no llamé a esto\newauthorname porque, para mí, suena como el comando que usarías paradefinirel autor, no imprimirlo.

EDITAR

Como se solicitó en los comentarios, aquí hay una pequeña variación que redefine el \authorcomando en lugar de definir un \Authorcomando nuevo. Si esto se va a utilizar con frecuencia, el código del preámbulo podría colocarse en un archivo de estilo, por ejemplo, fullauthor.styy luego incluirse con \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}

Respuesta2

Aquí, proporciono una respuesta: un ejemplo basado en el código de la respuesta anterior proporcionada por @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}

Este código produce exactamente la respuesta esperada.

ingrese la descripción de la imagen aquí

información relacionada