我使用pgffor
循环遍历逗号分隔的列表来分隔 CMYK 值。我认为问题出在我的\ifnum
比较中。我得到了一个错误。显然,我简化了代码以保持焦点。
代码
\documentclass{article}
\usepackage{pgffor}
\newcommand\addcolor[1]{%
\foreach \item [count=\step] in {#1} {%
\ifnum\step=1 \pgfmathsetmacro\valueC{\item}\fi%
\ifnum\step=2 \pgfmathsetmacro\valueM{\item}\fi%
\ifnum\step=3 \pgfmathsetmacro\valueY{\item}\fi%
\ifnum\step=4 \pgfmathsetmacro\valueK{\item}\fi%
\global\valueC\global\valueM\global\valueY\global\valueK%
}%
}%
\addcolor{0,20,100,0}
\begin{document}
\section{Current CMYK Values}
C:\valueC M:\valueM Y:\valueY K:\valueK
\end{document}
预期结果
答案1
问题不在于\ifnum
,而在于 的使用\global\valueC
。 的使用\global
旨在与定义或赋值一起使用,以指定定义或赋值的范围。 因此\global\def...
或\global\let...
是典型的。 由于\valueC
不是定义或赋值,因此语法\global\valueC
没有任何用处。
我不确定 的意图是什么\global\valueC
,但如果您想要将 定义为\valueC
全局的,则可以使用\global\let\valueC\valueC
。[我还将其更改\item
为\xitem
,因为使用已定义的命令让我感到不舒服]
\documentclass{article}
\usepackage{pgffor}
\newcommand\addcolor[1]{%
\foreach \xitem [count=\step] in {#1} {%
\ifnum\step=1 \pgfmathsetmacro\valueC{\xitem}\fi%
\ifnum\step=2 \pgfmathsetmacro\valueM{\xitem}\fi%
\ifnum\step=3 \pgfmathsetmacro\valueY{\xitem}\fi%
\ifnum\step=4 \pgfmathsetmacro\valueK{\xitem}\fi%
\global\let\valueC\valueC\global\let\valueM\valueM%
\global\let\valueY\valueY\global\let\valueK\valueK%
}%
}%
\addcolor{0,20,100,0}
\begin{document}
\section{Current CMYK Values}
C:\valueC{} M:\valueM{} Y:\valueY{} K:\valueK
\end{document}
约瑟夫建议采取一种更加简化的方法:
\documentclass{article}
\usepackage{pgffor}
\newcommand\addcolor[1]{%
\foreach \xitem [count=\step] in {#1} {%
\pgfmathsetmacro\temp{\xitem}
\ifnum\step=1 \global\let\valueC\temp\fi%
\ifnum\step=2 \global\let\valueM\temp\fi%
\ifnum\step=3 \global\let\valueY\temp\fi%
\ifnum\step=4 \global\let\valueK\temp\fi%
}%
}%
\addcolor{0,20,100,0}
\begin{document}
\section{Current CMYK Values}
C:\valueC{} M:\valueM{} Y:\valueY{} K:\valueK
\end{document}
最后,这里有一种方法\listofitems
:
\documentclass{article}
\usepackage{pgffor,listofitems}
\newcommand\addcolor[1]{%
\setsepchar{,}%
\readlist\cvalues{#1}%
\readlist\clabels{C,M,Y,K}%
\readlist\cquence{1,2,3,4}%
\foreachitem\xitem\in\cquence{%
\pgfmathsetmacro\temp{\cvalues[\xitem]}%
\expandafter\global\expandafter\let\csname value\clabels[\xitem]\endcsname\temp%
}%
}%
\addcolor{0,20,100,0}
\begin{document}
\section{Current CMYK Values}
C:\valueC{} M:\valueM{} Y:\valueY{} K:\valueK
\end{document}
答案2
你用的是大锤;无论如何,\global\valueC
这是违法的,应该
\global\let\valueC\valueC
但有一个更好的方法:
\documentclass{article}
\usepackage{pgf}
\makeatletter
\newcommand\addcolor[1]{%
\add@color#1\@nil
}
\def\add@color#1,#2,#3,#4\@nil{%
\pgfmathsetmacro\valueC{#1}%
\pgfmathsetmacro\valueM{#2}%
\pgfmathsetmacro\valueY{#3}%
\pgfmathsetmacro\valueK{#4}%
}
\makeatother
\begin{document}
\addcolor{0,20,100,0}
C:\valueC \quad M:\valueM \quad Y:\valueY \quad K:\valueK
\addcolor{1,2*3,3+12,4}
C:\valueC \quad M:\valueM \quad Y:\valueY \quad K:\valueK
\end{document}
更简单的方法:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\addcolor{m}
{
\tl_set:Nx \valueC { \fp_eval:n { \clist_item:nn { #1 } { 1 } } }
\tl_set:Nx \valueM { \fp_eval:n { \clist_item:nn { #1 } { 2 } } }
\tl_set:Nx \valueY { \fp_eval:n { \clist_item:nn { #1 } { 3 } } }
\tl_set:Nx \valueK { \fp_eval:n { \clist_item:nn { #1 } { 4 } } }
}
\ExplSyntaxOff
\begin{document}
\addcolor{0,20,100,0}
C:\valueC \quad M:\valueM \quad Y:\valueY \quad K:\valueK
\addcolor{1,2*3,3+12,4}
C:\valueC \quad M:\valueM \quad Y:\valueY \quad K:\valueK
\end{document}