![著者名を操作するマクロを作成するにはどうすればいいですか?](https://rvso.com/image/420046/%E8%91%97%E8%80%85%E5%90%8D%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
通常マクロ で宣言される名前の著者の情報を取得し\author
、それを名前、ミドルネーム、姓の 3 つの部分に分解できるマクロを作成したいと思います。そのためには、、、および タイプの内部マクロを作成\firstname
できます。その後、マクロはこの情報を取得し、姓、名、ミドルネームの形式で印刷できるようになります。たとえば、名前を宣言し、マクロ は、PDF ドキュメントに名前を の形式で印刷します。\midlename
\lastname
\author{Alexsandro Lucena Mota}
\newauthorname
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}
最初の 5 つのケースの処理は、かなり簡単です。ケース 6 では、すべての言語のすべての複数単語の姓に関する知識を組み込む必要があります。ケース 7 への対応は可能ですが、面倒です。もちろん、中国語などの一部の言語では、姓を最初にして名前を逆の順序で書くため、さらに問題があります。
これらの問題をすべて無視して、以下のコードは、、および\Author
を設定し、その引数をコマンドに渡すコマンド\firstname
を定義します。以下の画像が示すように、これはケース 1 ~ 6 に対応しており、ケース 6 では、 の追加による追加の支援が少し必要になります。このコマンドは、ケース 7 ではうまく機能しません。\middlename
\lastname
\author
~
\Author
コードは次のとおりです:
\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}
このコードはまさに期待通りの答えを生成します。