如何使用条件表达式作为键值参数?

如何使用条件表达式作为键值参数?

我想减少代码中使用的按键次数。更确切地说,我想简化

\ifodd\numexpr\ix+\iy\relax\psset{fillstyle=vlines,hatchsep=.5pt,hatchcolor=lightgray}\else\psset{fillstyle=solid}\fi
\psframe[origin={\ix,\iy}](-1,-1)

\psframe[origin={\ix,\iy},\ifodd\numexpr\ix+\iy\relax fillstyle=vlines,hatchsep=.5pt,hatchcolor=lightgray\else fillstyle=solid\fi](-1,-1)

不幸的是,后者无法编译,并且会出现一些您可以自己发现的错误。

以下是前者(即要简化的代码)和后者(即简化的代码但失败了)的完整代码。

未简化

\documentclass[pstricks,border=24pt]{standalone}
\usepackage{multido}
\begin{document}
\begin{pspicture}[dimen=m](8,8)
    \multido{\ix=1+1}{8}
    {
        \uput[d](!\ix\space .5 sub 0){$\char\numexpr\ix+96\relax\mathstrut$}
        \uput[l](!0 \ix\space .5 sub){$\ix\mathstrut$}
        \multido{\iy=1+1}{8}
        {       
            \ifodd\numexpr\ix+\iy\relax\psset{fillstyle=vlines,hatchsep=.5pt,hatchcolor=lightgray}\else\psset{fillstyle=solid}\fi
            \psframe[origin={\ix,\iy}](-1,-1)
            \rput(!\ix\space .5 sub \iy\space .5 sub){$(\ix,\iy)$}
        }
    }
\end{pspicture}
\end{document}

未能简化

\documentclass[pstricks,border=24pt]{standalone}
\usepackage{multido}
\begin{document}
\begin{pspicture}[dimen=m](8,8)
    \multido{\ix=1+1}{8}
    {
        \uput[d](!\ix\space .5 sub 0){$\char\numexpr\ix+96\relax\mathstrut$}
        \uput[l](!0 \ix\space .5 sub){$\ix\mathstrut$}
        \multido{\iy=1+1}{8}
        {           
            \psframe[origin={\ix,\iy},\ifodd\numexpr\ix+\iy\relax fillstyle=vlines,hatchsep=.5pt,hatchcolor=lightgray\else fillstyle=solid\fi](-1,-1)
            \rput(!\ix\space .5 sub \iy\space .5 sub){$(\ix,\iy)$}
        }
    }
\end{pspicture}
\end{document}

如何解决这个问题?

答案1

您想要一个条件值价值

    \psframe[origin={\ix,\iy},
             fillstyle=\ifodd\numexpr\ix+\iy\relax vlines\else solid\fi,
             hatchsep=.5pt,
             hatchcolor=lightgray](-1,-1)

在这里这是没问题的,因为hatchxxx在实体案例中按键被忽略了。

或者您需要使用不同数量的参数进行调用\psframe,就像您的问题或其他答案一样。

答案2

问题在于宏\psframe必须在之后进行扩展,而 latex 通常进行顺序扩展。可以使用宏的数量或结合使用\ifodd来更改扩展顺序:\expandafter\edef\noexpand

\documentclass[pstricks,border=24pt]{standalone}
\usepackage{multido}
\begin{document}
\begin{pspicture}[dimen=m](8,8)
    \multido{\ix=1+1}{8}
    {
        \uput[d](!\ix\space .5 sub 0){$\char\numexpr\ix+96\relax\mathstrut$}
        \uput[l](!0 \ix\space .5 sub){$\ix\mathstrut$}
        \multido{\iy=1+1}{8}
        {           
            \edef\my{\noexpand\psframe[origin={\ix,\iy},\ifodd\numexpr\ix+\iy\relax fillstyle=vlines,hatchsep=.5pt,hatchcolor=lightgray\else fillstyle=solid\fi](-1,-1)}
            \my
            \rput(!\ix\space .5 sub \iy\space .5 sub){$(\ix,\iy)$}
        }
    }
\end{pspicture}
\end{document}

相关内容