在我的论文中,我使用 TikZ 创作了许多图画。在这些图画中,我包括图片(例如名词项目) 使用 Creative Commons 许可。因此,我必须承认这些作品的作者。
由于我的画作最多包含十几张图片,我无法在标题中注明相应的作者。因此,我想在附录的特定部分中对他们表示感谢。
问题:如何在绘制 TikZ 图片时方便地存储贡献者的姓名,以便稍后在附录中使用它们?
我期望以下行为:
- 贡献者姓名存储:使用一个宏来存储作者和图片名称 - 例如
\mymacro{John Doe}{Sunrise}
。如果可能的话,我可以在一张图片中多次使用此宏(例如每次加载图标时),而无需多次注明作者。 - 确认生成:我将使用类似的宏
\printacknowledgement
,这将生成以下列表:图1:John Doe 的《日出》、Erika Mustermann 的《咖喱香肠》。
图 3:John Doe 的《日出》和《日落》。
注意:图 2不显示,因为没有贡献者需要被认可;在图 3,它应该打印“John Doe 的《日出》和《日落》“ 并不是 ”John Doe 的《日出》、John Doe 的《日落》»
注意::我承认这看起来像是一个需要我亲自解决的问题。我表达了需求规范,因为我不知道如何实现这一点,甚至不知道应该寻找什么包。但如果有人告诉我应该研究哪个包/宏,我当然愿意为解决方案开发做出贡献/自己开发它。
需求当然是理想的。我也会对更庞大的解决方案感到满意,因为\mymacro{Figure number}{John Doe}{Sunrise}
和«John Doe 的《日出》、John Doe 的《日落》» 正在打印。
编辑: 这collect
中提到的包如何在附录中收集文本以供日后使用?似乎无法在列表末尾添加名称。
答案1
在这里,我尝试实现 OP 请求的语法。 \mymacro{Author}{Title}
应根据需要在每个特定环境内添加figure
,并\printacknowledgement
在最后调用。
该逻辑用于处理带有一个或多个致谢的图片,以及处理作者重复如果给定图形内的重复在\mymacro
调用中相邻出现。
\documentclass{article}
\usepackage{graphicx,ifthen}
\newcounter{myack}
\newcounter{ackx}
\newcommand\mymacro[2]{%e.g. \mymacro{Erika Mustermann}{Curry wurst}
\stepcounter{myack}%
\expandafter\xdef\csname ack\themyack icon\endcsname{#2}% defines e.g. \ack2icon = Curry wurst
\expandafter\xdef\csname ack\themyack auth\endcsname{#1}% defines e.g. \ack2auth = Erika Mustermann
\expandafter\xdef\csname ack\themyack fig\endcsname{\thefigure}% defines e.g. \ack2fig = I1
}
\def\priorfig{0}
\def\isnewfig{T}
\newcommand\printacknowledgement{%
\section*{Acknowledgement}
\whiledo{\value{ackx}<\value{myack}}{% while nb of acknowledgment printed < nb of acknowledgment defined
\stepcounter{ackx}% number of acknowledgment printed += 1
\ifthenelse{
\equal{\csname ack\theackx fig\endcsname}{\priorfig}
}{% if acknowledgment is about same fig as the previous one
\def\isnewfig{F}% then \isnewfig = F
}{% else
\def\isnewfig{T}% isnewfig = T (this is a new figure)
\ifthenelse{% and thus print a dot (. - except for the very first figure)
\equal{\priorfig}{0}%
}{%
%
}{%
.%
}%
\par% and create a new paragraph
}%
%
\if T\isnewfig% ... and
\noindent\textit{Figure \csname ack\theackx fig\endcsname:} % start a new line with 'Figure <name of the figure>: '
\fi%
\if T\isnewfig%
%
\else% if its not a new figure
\if T\showauth\relax%
, % add ', ' only if we're crediting a new author.
\fi%
\fi%
\ifthenelse{%
\equal{\csname ack\theackx fig\endcsname}{\csname ack\the\numexpr\theackx+1\relax fig\endcsname}%
}{% if this credit and the next one are from the same picture
\ifthenelse{%
\equal{\csname ack\theackx auth\endcsname}{\csname ack\the\numexpr\theackx+1\relax auth\endcsname}%
}{%
\def\showauth{F}% \showauth = F: don't print author name right now cuz we need to add more icone names before
}{%
\def\showauth{T}% else \showauth = T (need to credit author name now)
}%
}{%
\def\showauth{T}% else \showauth = T (need to credit author name now)
}%
`\csname ack\theackx icon\endcsname' % print '<Icon's name> '
\if T\showauth%
by \csname ack\theackx auth\endcsname% print 'by <Author name>' if we've to print author name,
\else%
and % else print 'and ' (waiting for next icon's name)
\fi
%
\edef\priorfig{\csname ack\theackx fig\endcsname}% redefine Fig. nb and author of prior acknowledment
\edef\priorauth{\csname ack\theackx auth\endcsname}%
}.%
}
\begin{document}
\begin{figure}[ht]
\centering
\includegraphics[width=1in]{example-image}
\caption{blah blah}%
\mymacro{John Doe}{Sunrise}%
\mymacro{Erika Mustermann}{Curry wurst}%
\end{figure}
\begin{figure}[ht]
\centering
\includegraphics[width=1in]{example-image}
\caption{blah blah}%
\mymacro{John Doe}{Sunrise}%
\mymacro{John Doe}{Sunset}%
\end{figure}
\begin{figure}[ht]
\centering
\includegraphics[width=1in]{example-image}
\caption{blah blah}%
\mymacro{John Doe}{Sunrise}%
\end{figure}
\printacknowledgement
\end{document}
一个不太理想的行为,可以通过额外的工作来纠正,那就是如果一个给定的图表有 3 个(或更多)来自同一作者的图标,那么致谢将显示为'Sunrise' and 'Sunset' and 'Moonglow' by John Doe
,而不是'Sunrise', 'Sunset', and 'Moonglow' by John Doe
答案2
我知道这听起来像魔术,但是,嘿,它确实有效!
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\usepackage{enumitem}
\ExplSyntaxOn
\NewDocumentCommand{\addcredit}{mm}
{
\ebo_addcredit:nn { #1 } { #2 }
}
\NewDocumentCommand{\printcredits}{}
{
\ebo_printcredits:
}
\prop_new:N \g_ebo_credit_names_prop
\seq_new:N \g_ebo_credit_list_seq
\seq_new:N \l__ebo_credit_item_seq
\clist_new:N \l__ebo_credit_list_clist
\cs_new_protected:Nn \ebo_addcredit:nn
{
\prop_if_exist:cF { g_ebo_credit_ \thefigure _prop }
{
% create a property list and register it
\prop_new:c { g_ebo_credit_ \thefigure _prop }
\seq_gput_right:Nx \g_ebo_credit_list_seq { \thefigure }
}
\prop_if_in:cnTF { g_ebo_credit_ \thefigure _prop } { #1 }
{ % there's already credit for #1
\prop_gput:cnx { g_ebo_credit_ \thefigure _prop }
{ #1 }
{ \prop_item:cn { g_ebo_credit_ \thefigure _prop } { #1 } , \exp_not:n { { `#2' } } }
}
{ % no credit for #1
\prop_gput:cnn { g_ebo_credit_ \thefigure _prop }
{ #1 }
{ { `#2' } }
}
\prop_gput:Nnn \g_ebo_credit_names_prop { #1 } { #1 }
}
\cs_new_protected:Nn \ebo_printcredits:
{
\section{Acknowledgments}
\begin{itemize}[align=left,leftmargin=*]
\seq_map_inline:Nn \g_ebo_credit_list_seq
{
\item[\textit{Figure~##1}:] \__ebo_credit_print:n { ##1 }.
}
\end{itemize}
}
\cs_new_protected:Nn \__ebo_credit_print:n
{
\seq_clear:N \l__ebo_credit_item_seq
\prop_map_inline:cn { g_ebo_credit_ #1 _prop }
{% ##1 is the author, ##2 is the list of credits
\clist_set:Nn \l__ebo_credit_list_clist { ##2 }
\seq_put_right:Nx \l__ebo_credit_item_seq
{
\clist_use:Nnnn \l__ebo_credit_list_clist { ~and~ } { ,~ } { ,~and~ }~by~
\prop_item:Nn \g_ebo_credit_names_prop { ##1 }
}
}
\seq_use:Nn \l__ebo_credit_item_seq { ;~ }
}
\ExplSyntaxOff
\begin{document}
\begin{figure}[htp]
\caption{First figure}
\addcredit{John Doe}{Sunrise}
\addcredit{Erika Musterman}{Curry Wurst}
\end{figure}
\begin{figure}[!htp]
\caption{Second figure}
\end{figure}
\begin{figure}[!htp]
\caption{Third figure}
\addcredit{John Doe}{Sunrise}
\addcredit{John Doe}{Sunset}
\end{figure}
\begin{figure}[!htp]
\caption{Fourth figure}
\addcredit{\'Accented Aüthor}{Dawn}
\addcredit{John Doe}{Sunset}
\addcredit{John Doe}{Sunrise}
\addcredit{John Doe}{Evening}
\end{figure}
\printcredits
\end{document}
该\addcredit
宏将材料添加到与图形编号链接的属性列表中(因此必须出现在 之后\caption
)。
如果同一作者在同一个中进一步出现figure
,则相应的属性将添加新标题。图号按顺序存储,因此我们可以通过具有\addcredit
命令的图号进行映射。
\addcredit
您有责任确保同一张图的所有命令中的作者姓名相同。
该\printcredits
命令将图片序列与致谢进行映射;对于每个图片,将映射相应的属性列表以形成所需的文本:首先是贡献列表,然后是作者姓名。如果有两个贡献,则用“and”分隔;如果有多个贡献,则两个贡献之间会有一个逗号,最后一个除外,逗号是“, and”。如果您不喜欢牛津逗号,请在代码中删除逗号。
\addcredit
依次对同一作者使用figure
,否则最终的顺序将无法预测。