我想减少代码中使用的按键次数。更确切地说,我想简化
\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}