如何创建数组元素 arrayjobx 的部分

如何创建数组元素 arrayjobx 的部分

这是我的文件:

\documentclass{article}
\usepackage{arrayjobx}

\begin{document}

text
\newarray\tasks
\readarray{tasks}{
    1 & 2
}

\section{\tasks(1)}

\end{document}

\section{\tasks(1)}停止编译器。我该如何让它工作?

答案1

由于定义的宏arrayjobx不可扩展,因此将它们设为 是有意义的\protected

\documentclass{article}
\usepackage{arrayjobx}
\usepackage{xpatch}
\usepackage{hyperref}

% make \protected the macro defined by \newarray
\xpatchcmd{\newarray}{\expandafter\edef}{\protected\expandafter\edef}{}{}

\begin{document}

text
\newarray\tasks
\readarray{tasks}{
    1 & 2
}


\section{\tasks(1)}

\end{document}

另一方面,有更好的方法来定义数组并更简单地使用它们。

\documentclass{article}
\usepackage{hyperref}

\ExplSyntaxOn

\NewDocumentCommand{\definearray}{mm}
 {
  \seq_clear_new:c { g_intolighter_array_#1_seq }
  \seq_set_split:cnn { g_intolighter_array_#1_seq } { & } { #2 }
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { c }
\NewExpandableDocumentCommand{\arrayitem}{mm}
 {
  \seq_item:cn { g_intolighter_array_#1_seq } { #2 }
 }
\NewExpandableDocumentCommand{\arraylength}{m}
 {
  \seq_count:c { g_intolighter_array_#1_seq }
 }

\ExplSyntaxOff

\begin{document}

\definearray{tasks}{
    A & B
}

\section{\arrayitem{tasks}{1}}

The \texttt{tasks} array has \arraylength{tasks} items.

\end{document}

在此处输入图片描述

您会看到书签也正确输出。

arrayjobx可以实现其他功能。

答案2

您需要的功能可以在 TeX 原始级别定义,而无需使用特定的 LaTeX 包:

\documentclass{article}

\newcount\arranum
\def\readarray #1#2{%
   \sdef{#1}(##1){\trycs{arra:#1:##1}{\arraundef{#1(##1)}}}%
   \arranum=0 \readarrayA {#1}#2&\end&%
   \expanded{\noexpand\sdef{arral:#1}{\the\arranum}}%
}
\def\readarrayA #1#2&{\ifx#2\end \else
   \advance\arranum by1
   \sdef{arra:#1:\the\arranum}{#2}%
   \afterfi\readarrayA{\readarrayA{#1}}%
   \fi
}
\def\arraundef#1{\message{Warning: array item #1 isn't declared.}}
\def\sdef#1{\expandafter\def\csname#1\endcsname}
\def\trycs#1#2{\ifcsname#1\endcsname \csname#1\endcsname \else#2\fi}
\def\afterfi#1#2\fi{\fi#1}
\def\arraylength#1{\trycs{arral:#1}{\arrayundef{#1}}}

\begin{document}

\readarray{tasks}{
    A & B
}

\section{\tasks(1)}

The \texttt{tasks} array has \arraylength{tasks} items.

\end{document}

相关内容