我想创建一个宏,该宏可以获取作者姓名的信息(通常在宏中声明)\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}
这段代码给出了我们所期望的答案。