Wie erstelle ich ein Makro, das den Namen des Autors manipuliert?

Wie erstelle ich ein Makro, das den Namen des Autors manipuliert?

Ich möchte ein Makro erstellen, das die Informationen zum Namen des Autors, die normalerweise im Makro angegeben werden \author, in drei Teile aufteilen kann: Vorname, zweiter Vorname und Nachname. Dazu könnten interne Makros vom Typ \firstname, \midlename, und \lastnameerstellt werden. Das Makro könnte diese Informationen dann annehmen und im Format Nachname, Vorname und zweiter Vorname drucken. Ich könnte beispielsweise den Namen angeben \author{Alexsandro Lucena Mota}und das Makro würde beispielsweise \newauthornameden Namen im PDF-Dokument in der Form drucken Mota, Alexsandro Lucena.

Hinweis: Das \newauthornameMakro war nur ein Vorschlag, der vielleicht nicht der beste war. Hier ist die Absicht, in den Bibliographiezitaten auf den Namen des Autors zu verweisen, aber in der Form des oben angegebenen Beispiels, also . Mota, Alexsandro LucenaVielleicht wäre ein besserer Name für dieses Makro \authornameinbibliographycitation, es ist jedoch sicherlich sehr lang. Sie können gerne Ihre Vorschläge machen.

Gibt es bekannte Pakete oder Makros, die dies können?

Möglicherweise fragt sich noch immer jemand: „Wozu brauchen Sie das?“

In Brasilien müssen bei Abschlussarbeiten und Dissertationen hinter dem Deckblatt die Katalogdaten angegeben werden, wie im folgenden Beispiel.

Bildbeschreibung hier eingeben

Daher möchte ich, dass LaTeX den Namen des Autors im Format des Beispiels in der obigen Abbildung druckt.

Aber jemand könnte dennoch fragen: Warum schreiben Sie nicht mit der Hand?

Und die Antwort ist, dass ich ein Paket erstellen möchte, sodass der Benutzer sich nur darum kümmern muss, seinen Namen in das Makro einzugeben \author, und LaTeX sich um den Rest kümmert und die Datei automatisch generiert.

Und schließlich wird jemand nach einer Minimalprobe fragen und sich deshalb bei der Verkostung an einen Verhaltenskodex halten.

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

Der obige Code erzeugt

Bildbeschreibung hier eingeben

Ich hoffe daher, dass ich genügend Informationen bereitgestellt habe, um mögliche Antworten anzuleiten.

Antwort1

Das Problem, das ich bei der Bereitstellung von Befehlen sehe, die implizite Informationen aus dem extrahieren, \authorist, dass es zu viele Sonderfälle gibt, um sie richtig zu machen. Im Idealfall sollte es mit jedem der folgenden Anwendungsfälle richtig umgehen können:

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

Die ersten fünf Fälle sind relativ unkompliziert zu handhaben. Fall 6 erfordert Kenntnisse über alle aus mehreren Wörtern bestehenden Nachnamen in allen Sprachen. Die Bewältigung von Fall 7 wäre möglich, aber mühsam. Natürlich gibt es weitere Probleme, da in einigen Sprachen, wie etwa Mandarin, Namen in umgekehrter Reihenfolge geschrieben werden, also der Nachname zuerst.

Wenn man all diese Probleme ignoriert, definiert der folgende Code einen \AuthorBefehl \firstname, der und setzt \middlenameund \lastnamesein Argument auch an den \authorBefehl weitergibt. Wie das Bild unten zeigt, ist er für die Fälle 1 bis 6 geeignet, wobei Fall 6 ein wenig zusätzliche Hilfe durch das Hinzufügen eines erfordert ~. Der \AuthorBefehl funktioniert nicht gut mit Fall 7.

Bildbeschreibung hier eingeben

Hier ist der Code:

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

Die Idee ist ganz einfach: Verwenden SieLaTeX3 Reguläre Ausdrückeum die Autorennamen in die Leerzeichen aufzuteilen und dann den letzten „Namen“ als Nachnamen festzulegen, alle verbleibenden Vornamen als Vornamen und alles, was übrig bleibt, wird zum zweiten Vornamen. Das \NamesMakro ist nur ein Hilfsmakro, um zu zeigen, was \Authores tut.

Der Code stellt einen \fullauthorBefehl bereit, der druckt last name, first name middle name. Ich habe diesen nicht aufgerufen \newauthorname, weil das für mich wie der Befehl klingt, den Sie verwenden würden, umdefinierender Autor, nicht, es zu drucken.

BEARBEITEN

Wie in den Kommentaren gefordert, gibt es hier eine kleine Variante, die den \authorBefehl neu definiert, anstatt einen neuen \AuthorBefehl zu definieren. Wenn dies häufig verwendet wird, könnte der Code in der Präambel beispielsweise in eine Stildatei eingefügt fullauthor.styund dann mit eingebunden werden \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}

Antwort2

Hier gebe ich eine Antwort – ein Beispiel basierend auf dem Code aus der obigen Antwort von @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}

Dieser Code liefert genau die erhoffte Antwort.

Bildbeschreibung hier eingeben

verwandte Informationen