在此示例中,如何使用 { 和 } 作为分隔符而不是活动字符?
我想要 [360] [90] [7,2] 作为foreach 命令的输出而不是这样。
我需要一个兼容的字符串foreach
,;
因为参数包含逗号小数分隔符。
\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz,xstring}
\begin{document}
\StrSubstitute{360;90;7,2}{;}{\},\{}[\ListeA]
\xdef\ListeA{\{\ListeA\}}
\ListeA
\foreach \x in \ListeA {[\x] }
\end{document}
答案1
这将产生所需的输出
\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\def\foo#1{\xfoo#1;\relax;}
\def\xfoo#1;{\ifx\relax#1\else\xxfoo{#1}\expandafter\xfoo\fi}
\newcommand\xxfoo[1]{[#1]}
\begin{document}
\foo{360;90;7,2}
\end{document}
如果您坚持使用,\foreach
您可以在第一个循环中构造一个列表来循环,\foreach
但这是完全没有意义的,您在主体中所做的任何事情\foreach
都可以在第一个循环中完成。
这次与法国巴贝尔;
\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tikz}
\begin{document}
\def\foo#1{\expandafter\expandafter\expandafter\zfoo\xfoo#1;\relax;}
\def\xfoo#1;{\ifx\relax#1\else,{#1}\expandafter\xfoo\fi}
\def\zfoo#1{}
\edef\zz{\foo{360;90;7,2}}
\foreach\x in \zz{
This is [\x]
}
\end{document}
答案2
这是一个解决方案expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\addbrackets}{ m }
{
\tarass_addbrackets:n { #1 }
}
\seq_new:N \l__tarass_addbrackets_seq
\cs_new_protected:Npn \tarass_addbrackets:n #1
{
\seq_set_split:Nnn \l__tarass_addbrackets_seq { ; } { #1 }
[\seq_use:Nn \l__tarass_addbrackets_seq {]~[}]
}
\ExplSyntaxOff
\begin{document}
\addbrackets{360;90;7,2}
\end{document}
可以进行多种改进。
如果您正在使用法语模块babel
,那么您必须意识到它;
是一个特殊字符,因为法语有在分号前留空格的特殊习惯。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{xparse}
\ExplSyntaxOn
\shorthandon{;}
\NewDocumentCommand{\addbrackets}{ m }
{
\tarass_addbrackets:n { #1 }
}
\seq_new:N \l__tarass_addbrackets_seq
\cs_new_protected:Npn \tarass_addbrackets:n #1
{
\seq_set_split:Nnn \l__tarass_addbrackets_seq { ; } { #1 }
[\seq_use:Nn \l__tarass_addbrackets_seq {]~[}]
}
\shorthandoff{;}
\ExplSyntaxOff
\begin{document}
\addbrackets{360;90;7,2}
\end{document}