迭代单个元素字符串

迭代单个元素字符串

我目前想实现一个 LaTeX 程序,它迭代命令(在我的情况下)的输出perltex。输出是一个字符串,其中的可迭代项用逗号分隔。一个完整的工作示例(加上可能一些不必要的包):

\documentclass[12pt, a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{todonotes}

\usepackage{listings}
\usepackage[printwatermark]{xwatermark}
\usepackage{perltex}


\perlnewcommand{\foo}{
return "a,b";
}

\newcounter{counter}
\begin{document}
\foreach \counter in \foo{
Element: \counter
}
\end{document}

必须使用 bash 命令(例如)来编译该文档perltex --nosafe --latex=pdflatex deleteme.tex。尽管这似乎是一个相当直接和简单的问题,但我找不到任何包含带引号的字符串的解决方案。

有什么方法可以将这些字符串转换为可读列表或对其进行迭代?

我的代码中使用\foreach的是待办事项包,但是特基兹给出了相同的结果。请注意,我无法使用常规 重现此问题\newcommand

答案1

\foreach实际问题不在于与字符串的组合,而在于 PerlTex 返回的解释不正确。一旦我意识到问题所在,我就创建了一个解决方法,即不返回实际的字符串,而是返回一个\renewcommand。我为后人添加了一个功能示例:

\documentclass[12pt, a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{todonotes}

\usepackage{listings}
\usepackage{xparse}
\usepackage[printwatermark]{xwatermark}
\usepackage{xcolor}
\usepackage{perltex}
\usepackage{etoolbox}

\perlnewcommand{\foo}{
$output = 'a,b';
return '\renewcommand{\perltext}{a,b}';}




\newcounter{counter}

\parindent=0pt
\begin{document}
\newcommand{\perltext}{}
\foo
\foreach \counter in \perltext{
Element: \counter
}


\end{document}

感谢@Andrew 和@egreg 带我来这里。

答案2

像这样吗?

\documentclass{article}
\usepackage{etoolbox}

\newcommand{\perloutput}{return "a,b";}

\newcounter{counter}
\newcommand\ProcessOutput[1]{%
  \renewcommand*{\do}[1]{\refstepcounter{counter}\textbf{Element \thecounter}: ##1.\newline}%
  \expandafter\docsvlist\expandafter{#1}%
}
\parindent=0pt

\begin{document}

  \ProcessOutput\perloutput

\end{document}

输出结果如下:

enter image description here

一些解释。电子工具箱软件包提供了几个处理逗号分隔列表的命令。最简单的一个是\docsvlist将当前宏应用于\do 命令分隔列表的每个元素。

相关内容