当我尝试在一行中打印姓名而在另一行中打印电话号码时,我不知道如何重置计数器。我知道我可以避免这个问题,但我正在做的工作需要这样做。
以下是我目前所取得的成果:
这是我的代码
\documentclass[a4paper,12pt]{article}
\newcounter{faglig}\renewcommand{\thefaglig}{\alph{faglig}}
\makeatletter
\let\contactrow\@gobble
\let\telephonerow\@gobble
%\setcounter{faglig}{0}
%\stepcounter{faglig}
%\textsuperscript{\,\thefaglig}
\def\contact#1{%
\ifx\contactrow\@gobble\def\contactrow{\textbf {Person:}}\fi
\expandafter\def\expandafter\contactrow\expandafter{\contactrow\hspace{1cm}#1\stepcounter{faglig}\textsuperscript{\,\thefaglig}}}
\setcounter{faglig}{0}
\def\telephone#1{%
\ifx\telephonerow\@gobble\def\telephonerow{\textbf {Telephone:}}\fi
\expandafter\def\expandafter\telephonerow\expandafter{\telephonerow\hspace{1cm}#1\stepcounter{faglig}\textsuperscript{\,\thefaglig}}}
\makeatother
\contact{John Doe}
\telephone{12345}
\contact{Jane Doe}
\telephone{91145}
\contact{Donald Trump}
\telephone{67890}
\begin{document}
\contactrow
\newline
\telephonerow
\end{document}
问题是如何重置计数器,以便根据姓名对电话号码进行索引。我认为可以重置的命令似乎不起作用。如您所见,我尝试了一些被注释掉的替代方案。如果有人对代码有其他评论,我也会很感激。我对这种类型的编程很陌生,但它非常有趣。我希望有人能指导我正确的方法。
答案1
你不需要反击,但是expl3
。;-)
我们\seq_indexed_map_function:NN
可以使用按序列存储的项目的索引号。
我还添加了一个宏来以表格形式打印数据,只是为了举一个不同的例子。
\documentclass[a4paper,12pt]{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_osterlie_contact_person_seq
\seq_new:N \g_osterlie_contact_telephone_seq
% store the items in the appropriate sequence
\NewDocumentCommand{\contact}{m}
{
\seq_gput_right:Nn \g_osterlie_contact_person_seq { #1 }
}
\NewDocumentCommand{\telephone}{m}
{
\seq_gput_right:Nn \g_osterlie_contact_telephone_seq { #1 }
}
% Deliver the names, with the index (in alphabetical form) as a superscript
\NewDocumentCommand{\contactrow}{}
{
Person:
\seq_indexed_map_function:NN \g_osterlie_contact_person_seq \osterlie_contact_print:nn
}
% Deliver the phone number, with the index (in alphabetical form) as a superscript
\NewDocumentCommand{\telephonerow}{}
{
Telephone:
\seq_indexed_map_function:NN \g_osterlie_contact_telephone_seq \osterlie_contact_print:nn
}
% Deliver the data in tabular form
\NewDocumentCommand{\contacts}{}
{
\begin{tabular}
{
@{}
l
*{\seq_count:N \g_osterlie_contact_person_seq}{c}
@{}
}
Person:
\seq_map_function:NN \g_osterlie_contact_person_seq \osterlie_contact_tabular:n
\\
Telephone:
\seq_map_function:NN \g_osterlie_contact_telephone_seq \osterlie_contact_tabular:n
\end{tabular}
}
\cs_new:Nn \osterlie_contact_print:nn
{
\hspace{1cm}#2\textsuperscript{\int_to_alph:n{#1}}
}
\cs_new:Nn \osterlie_contact_tabular:n
{
& #1
}
\ExplSyntaxOff
\contact{John Doe}
\telephone{12345}
\contact{Jane Doe}
\telephone{91145}
\contact{Donald Trump}
\telephone{67890}
\begin{document}
\contactrow\par
\telephonerow
\bigskip
\contacts
\end{document}
答案2
在您的示例中,\setcounter{faglig}{0}
位于\contactrow
和的定义之间\telephonerow
,这意味着它在文档开始之前就执行了,而且计数器无论如何都是 0。
将其放置\setcounter{faglig}{0}
在电话行的开头或文件中使用\contactrow
和的行之间:\telephonerow
\documentclass[a4paper,12pt]{article}
\newcounter{faglig}\renewcommand{\thefaglig}{\alph{faglig}}
\makeatletter
\let\contactrow\@gobble
\let\telephonerow\@gobble
%\setcounter{faglig}{0}
%\stepcounter{faglig}
%\textsuperscript{\,\thefaglig}
\def\contact#1{%
\ifx\contactrow\@gobble\def\contactrow{\textbf {Person:}}\fi
\expandafter\def\expandafter\contactrow\expandafter{\contactrow\hspace{1cm}#1\stepcounter{faglig}\textsuperscript{\,\thefaglig}}}
\def\telephone#1{%
\ifx\telephonerow\@gobble\def\telephonerow{\setcounter{faglig}{0}\textbf {Telephone:}}\fi
\expandafter\def\expandafter\telephonerow\expandafter{\telephonerow\hspace{1cm}#1\stepcounter{faglig}\textsuperscript{\,\thefaglig}}}
\makeatother
\contact{John Doe}
\telephone{12345}
\contact{Jane Doe}
\telephone{91145}
\contact{Donald Trump}
\telephone{67890}
\begin{document}
\contactrow
\newline
%\setcounter{faglig}{0}
\telephonerow
\end{document}