我目前想实现一个 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}
输出结果如下:
一些解释。电子工具箱软件包提供了几个处理逗号分隔列表的命令。最简单的一个是\docsvlist
将当前宏应用于\do
命令分隔列表的每个元素。