这是我的文件:
\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}