如何保存待记入贡献者的名单,以便稍后在附录中致谢

如何保存待记入贡献者的名单,以便稍后在附录中致谢

在我的论文中,我使用 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,否则最终的顺序将无法预测。

在此处输入图片描述

相关内容