重置计数器使用程序行

重置计数器使用程序行

当我尝试在一行中打印姓名而在另一行中打印电话号码时,我不知道如何重置计数器。我知道我可以避免这个问题,但我正在做的工作需要这样做。

以下是我目前所取得的成果:

在此处输入图片描述

这是我的代码

\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}

在此处输入图片描述

相关内容