如何在 \foreach 迭代器中转义 /None?

如何在 \foreach 迭代器中转义 /None?

最后调用的编译器是

ps2pdf -dAutoRotatePages#/None frames.ps

对于 Windows 或

ps2pdf -dAutoRotatePages=/None frames.ps

对于非 Windows。

我想要调用的代码片段如下。

\foreach \compiler/\ext in {latex/tex,dvips/dvi,ps2pdf -dAutoRotatePages#/None/ps}
    {\immediate\write18{\compiler\space frames.\ext}}

但如果你需要完整的代码,请参阅我的最后一个答案这里

迭代器可能会与用作分隔符的 相混淆。如何/None转义?//None

答案1

您不仅想逃避/None,而且#在这种情况下这也是违法的:

\edef\hms{\string#/}% Hash Mark Slash
\foreach \compiler/\ext in {latex/tex,dvips/dvi,ps2pdf -dAutoRotatePages\hms None/ps}
    {\immediate\write18{\compiler\space frames.\ext}}

您在聊天中提到的变体甚至更好:

\edef\AutoRotateOff{-dAutoRotatePages\string#/None}
\foreach \compiler/\ext in {latex/tex,dvips/dvi,ps2pdf \AutoRotateOff/ps}
    {\immediate\write18{\compiler\space frames.\ext}}

\write两者都利用了充分扩展其论点的事实。

另一个变体:

\makeatletter
\foreach \compiler/\ext in {latex/tex,dvips/dvi,%
  \@firstofone{ps2pdf -dAutoRotatePages\string#/None}/ps}
    {\immediate\write18{\compiler\space frames.\ext}}
\makeatother

答案2

根据@egreg 的回答,/可以从中删除,\hms但我们需要{...}如下ps2pdf项目。

\edef\hms{\string#}

\foreach \compiler/\ext in {latex/tex,dvips/dvi,{ps2pdf -dAutoRotatePages\hms/None}/ps}{\immediate\write18{\compiler\space temporary.\ext}}

平均能量损失

% this input file name is filename.tex
% compile it with pdflatex -shell-escape filename.tex

\documentclass[preview,border=12pt]{standalone}

\usepackage{filecontents}

\begin{filecontents*}{temporary.tex}
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}(4,2)
    \rput{90}(2,1){Marienplatz}
\end{pspicture}
\end{document}
\end{filecontents*}


\usepackage{graphicx,pgffor}
\edef\hms{\string#}

\foreach \compiler/\ext in {latex/tex,dvips/dvi,{ps2pdf -dAutoRotatePages\hms/None}/ps}{\immediate\write18{\compiler\space temporary.\ext}}

\begin{document}
\includegraphics{temporary}
\end{document}

有关 Windows 的更多信息

根据我使用 Windows 7 的经验,-dAutoRotatePages=/None和都-dAutoRotatePages#/None可以在 Windows 上运行。因此,最简单的解决方案只需要{...}如下。

% this input file name is filename.tex
% compile it with pdflatex -shell-escape filename.tex

\documentclass[preview,border=12pt]{standalone}

\usepackage{filecontents}

\begin{filecontents*}{temporary.tex}
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}(4,2)
    \rput{90}(2,1){Marienplatz}
\end{pspicture}
\end{document}
\end{filecontents*}


\usepackage{graphicx,pgffor}

\foreach \compiler/\ext in {latex/tex,dvips/dvi,{ps2pdf -dAutoRotatePages=/None}/ps}{\immediate\write18{\compiler\space temporary.\ext}}

\begin{document}
\includegraphics{temporary}
\end{document}

警告

不要替换\string#为,\#因为这样\#做不起作用(我刚刚尝试过)。

答案3

编辑(2017):因为xint 1.1 (2014/10/28)这里需要\usepackage{xinttools},而不是\usepackage{xint}

由于 \xintForpair不使用,/因此可以使用更简单的语法:

% this input file name is filename.tex
% compile it with pdflatex -shell-escape filename.tex

\documentclass[preview,border=12pt]{standalone}
\usepackage{filecontents}

\begin{filecontents*}{temporary.tex}
\documentclass[pstricks,border=12pt]{standalone}
\begin{document}
\begin{pspicture}(4,2)
    \rput{90}(2,1){Marienplatz}
\end{pspicture}
\end{document}
\end{filecontents*}


\usepackage{graphicx}
\usepackage{xinttools}

\xintForpair #1#2 in 
   {(latex,tex),(dvips,dvi),(ps2pdf -dAutoRotatePages\string#/None,ps)}
\do {\immediate\write18{#1 temporary.#2}}

\begin{document}
\includegraphics{temporary}
\end{document}

最新版本信特透明地删除逗号分隔列表中的空格,因此上面的内容可能包含您想要的逗号和括号周围的所有额外空格。

相关内容