有没有办法在 LaTeX 中创建数组。我想编写一个函数来执行此操作(此处数组只有 2 个元素,但我希望能够拥有任意数量的元素)。
\foo{\MakeArray{foo,bar}}
foo|bar-foo&bar
我本可以这样做
\newcommand\foo[2]{\1-\2}
\foo{foo|bar}{foo&bar}
但是我需要输入两次元素,这不是很整洁......
编辑: 遗憾的是,即使你的答案解决了我的问题,它也不适用于我的具体情况,所以我会准确地告诉你。我目前有
\newcommand{\authors}[2][e ]{
\usepackage[pdfauthor={#1}]{hyperref}
\author{#2}
}
我使用这种方式
\authors{John Doe, Dark Vador and Yoda}{John Doe \and Dark Vador \and Yoda}
我希望得到相同的结果,而无需指定两次。但是,\and
建议的解决方案不起作用。
答案1
加载hyperref
包裹首先,然后使用以下命令设置 PDF 文档属性\hypersetup
:
\documentclass{article}
\usepackage{hyperref}% http://ctan.org/pkg/hyperref
\newcommand{\authors}[1]{
{\renewcommand{\and}{\unskip, }\hypersetup{pdfauthor={#1}}}
\author{#1}
}
\title{My title}
\authors{John Doe \and Dark Vador \and Yoda}
\begin{document}
\maketitle
\end{document}
在里面\authors
,的定义\and
暂时更新以插入逗号。
答案2
对于特殊情况,还有一个廉价的解决方案。\and
可以对 进行重新hyperref
定义pdfauthor
:
\documentclass{article}
\usepackage{hyperref}
\pdfstringdefDisableCommands{\def\and{, }}
\newcommand*{\authors}[1]{%
\hypersetup{pdfauthor={#1}}%
\author{#1}%
}
\title{Test document}
\authors{John Doe\and Dark Vador\and Yoda}% without space before \and
\begin{document}
\maketitle
\end{document}
并pdfinfo
报告:
Author: John Doe, Dark Vador, Yoda
答案3
实际应用对于xparse
和来说几乎是微不足道的expl3
。
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand{\authors}{O{,}m}
{
\legat_authors:nn { #1 } { #2 }
}
\seq_new:N \g_legat_authors_seq
\cs_new_protected:Npn \legat_authors:nn #1 #2
{
\seq_gset_split:Nnn \g_legat_authors_seq { #1 } { #2 }
\use:x
{
\exp_not:N \hypersetup {pdfauthor={ \seq_use:Nn \g_legat_authors_seq { , } } }
}
\author{ \seq_use:Nn \g_legat_authors_seq { \and } }
}
\ExplSyntaxOff
\begin{document}
\authors{John Doe, Dark Vador, Yoda}
\title{Star Wears}
\maketitle
\end{document}
唯一微妙的一点是将作者列表扩展到\hypersetup
,并通过获得\use:x
。
该命令\authors
有一个可选参数;如果需要除逗号以外的其他分隔符,则可以在可选参数中设置它:
\authors[;]{Dean Martin; Sammy Davis, Jr; Jerry Lewis}
请注意,这需要最新的 TeX 发行版。
它是如何工作的?该\seq_gset_split:Nnn
函数(全局)将第三个参数存储为序列的元素,使用第二个参数作为项之间的分隔符。然后可以根据需要多次使用此序列。在这里,我们首先使用它来将逗号分隔的作者列表传递给\hypersetup
,然后将其作为 的参数传递给\author
。
答案4
由于我无法让您的输出提供任何输出,我改变了一些定义以生成您请求的形式的解析输出。
\documentclass{article}
\usepackage{stringstrings}
\renewcommand\and{\textbf{AND}}
\newcommand\MYusepackage[2][1]{[#1]\{#2\}\par}
\newcommand\MYauthor[1]{#1}
\newcommand\authors[1]{%
\MYusepackage[pdfauthor={#1}]{hyperref}%
\encodetoken{\and}
\convertword[e]{#1}{~and~}{, }%
\convertchar[e]{\thestring}{,}{ \and}%
\retokenize{\thestring}%
\MYauthor{\thestring}%
\decodetoken{\and}%
}
\begin{document}
\authors{John Doe, Dark Vador and Yoda}
\end{document}