代码

代码

我使用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}

预期结果

enter image description here

答案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}

enter image description here

约瑟夫建议采取一种更加简化的方法:

\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}

enter image description here

更简单的方法:

\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}

相关内容