Não tenho experiência com LaTeX/TikZ
, então posso estar fazendo algo idiota.
Eu tenho duas versões deste código. Um funciona e o outro não, e estou perdendo o juízo tentando descobrir por que o segundo não funciona.
Primeiro, a versão que funciona:
\documentclass[parskip]{scrartcl}
\usepackage[left=1cm, right = 3cm, top = 1cm, bottom = 1cm]{geometry}
\usepackage{tikz}
\usepackage{pifont}
\usepackage{xifthen}
\usepackage[utf8]{inputenc}
\usepackage{forloop}
\usepackage[nomessages]{fp}
\usetikzlibrary{shapes}
\usetikzlibrary{calc}
\newcommand\sz{1.5cm}
%usage: size guid
\newcommand\hexboard[2]{
\begin{tikzpicture} [hexa/.style= {shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture]
\newcommand\sep{x}
\pgfmathsetmacro\minCoord{int(-1*#1)}
\foreach \j in {\minCoord,...,#1}{%
\foreach \i in {\minCoord,...,#1}{%
\ifthenelse{\cnttest{ \minCoord }{<}{ \i*\j }}{\node[hexa] (#2_h\i\sep\j) at ({(\i*.75*\sz)},{\j*\sz*sqrt(3)/2 - \i*\sz*sqrt(3)/4}) {\i\sep\j};}{}
}
}
\end{tikzpicture}
}
%usage: {{x1,y1}...} color opacity guid
\newcommand\targetedHexes[4]{
\begin{tikzpicture} [hexa/.style= {fill opacity = #3, shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture, overlay]
\foreach [count=\x] \pt in {#1} {
\node [hexa, fill = #2] (target\x) at (#4_h\pt) {};
}
\end{tikzpicture}
}
%usage: guid
\newcommand\drawSelf[1]{
\begin{tikzpicture} [hexa/.style= {fill opacity = .5, shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture, overlay]
\node [hexa, color = blue] (self) at (#1_h0x0){};
\end{tikzpicture}
}
\newcommand\areaEffect[2]{
\hexboard{#1}{hello}
\targetedHexes{#2}{red}{0.5}{hello}
\drawSelf{hello}
}
\begin{document}
\areaEffect{2}{{0x1},{0x2},{1x0}}
\end{document}
Basicamente, o que ele faz é desenhar uma grade hexadecimal e, em seguida, substituir certos hexadecimais (passados como uma lista de coordenadas) por uma cor diferente.
Eu gostaria de poder especificar vários grupos, cada um recebendo um color
/ opacity
. No entanto, modificar o texto acima para substituir as últimas 10 linhas não funciona:
\newcommand\areaEffect[2]{
\hexboard{#1}{hello}
\foreach [count=\s] \section in {#2}{
\targetedHexes{\section}{red}{0.15*\s}{hello}
}
\drawSelf{hello}
}
\begin{document}
\areaEffect{2}{{{0x1},{0x2}},{{1x0}}}
\end{document}
Especificamente, enquanto na versão antiga, in \targetedHexes
, in (target\x)
at (#4_h\pt)
, \pt
é avaliado como 0x1
ou 0x2
. Na nova versão, avalia como {0x1}
ou {0x2}
.
Acho que minhas perguntas são as seguintes:
O que está acontecendo aqui? Por que são diferentes? Eles não deveriam ser mais ou menos equivalentes?
Como faço para corrigir a segunda versão?
Obrigado pelo seu tempo!
Responder1
Na primeira versão, \targetedHexes
é chamado com {0x1},{0x2},{1x0}
o primeiro argumento, por substituição ordinária de parâmetros.
Na segunda versão, \targetedHexes
é chamado with \section
como primeiro argumento; nenhuma expansão ocorre neste ponto. Agora depende do código subsequente se \section
será expandido no tempo; o que aparentemente não é.
Expandir \section
antes de ligar targetedHexes
parece funcionar.
\newcommand\areaEffect[2]{
\hexboard{#1}{hello}
\foreach [count=\s] \section in {#2}{
\expandafter\targetedHexes\expandafter{\section}{red}{0.15*\s}{hello}
}
\drawSelf{hello}
}