![Wie erstelle ich ein Makro, das den Namen des Autors manipuliert?](https://rvso.com/image/420046/Wie%20erstelle%20ich%20ein%20Makro%2C%20das%20den%20Namen%20des%20Autors%20manipuliert%3F.png)
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 \lastname
erstellt 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 \newauthorname
den Namen im PDF-Dokument in der Form drucken Mota, Alexsandro Lucena
.
Hinweis: Das \newauthorname
Makro 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 Lucena
Vielleicht 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.
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
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, \author
ist, 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 \Author
Befehl \firstname
, der und setzt \middlename
und \lastname
sein Argument auch an den \author
Befehl 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 \Author
Befehl funktioniert nicht gut mit Fall 7.
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 \Names
Makro ist nur ein Hilfsmakro, um zu zeigen, was \Author
es tut.
Der Code stellt einen \fullauthor
Befehl 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 \author
Befehl neu definiert, anstatt einen neuen \Author
Befehl zu definieren. Wenn dies häufig verwendet wird, könnte der Code in der Präambel beispielsweise in eine Stildatei eingefügt fullauthor.sty
und 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.