No meupostagem anterior, perguntei como usar dois loops para construir uma grade com valores dentro dela. Um maravilhosoresponder foi dado porAndré Swann.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\def\n{6}
\def\m{8}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach[evaluate] \x in {1,...,\n}
{ foreach[evaluate={\z = int(min(\x,\n+1-\x)+\n*min(\y-1,\m-\y)/2)}] \y in {1,...,\m}
{({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};
\end{document}
ele forneceu uma fórmula \z
que pode ser modificada para diferentes arranjos de valores.
Por exemplo, eu fiz-
[avaliar= {\z = int(\x+\n*min(\y-1,\m+\y))}]
que dá-
1 2 3 4
5 6 7 8
9 10 11 12
para grade 3*4. Mas se eu quiser -
1 2 2 1
3 4 4 3
5 6 6 5
7 8 8 7
e ,
1 2 3 4
5 6 7 8
0 9 10 0
0 11 12 0
0 13 14 0
Eu não pude fazer! Estou realmente tendo dificuldade para usar o loop e a condição if else. Provavelmente, estou muito acostumado com C++ e coisas semelhantes, onde posso facilmente fazer a=a+1 ou escrever uma condição if. Posso pensar em uma maneira de imprimir os arranjos de valores acima, usandoDoença(if/else), mas não sei onde colocar (tentei, mas todos estavam errados).
Então, minha pergunta é: como colocarDoença(if/else) antes \z
para que eu possa imprimir a saída como mostrei acima?
Responder1
Você poderia facilmente usar ifthenelse no nó tikz:
\documentclass{minimal}
\usepackage{tikz}
\usepackage{ifthen}
\begin{document}
\def\n{4}
\def\m{4}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s)
foreach[evaluate] \x in {1,...,\n} {
foreach[evaluate={
\zt = int(\x+\n*min(\y-1,\m+\y));
\zb = int(\x+(\n-2)*min(\y-1,\m+\y)+3)
}] \y in {1,...,\m} {
({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\ifthenelse{\y>2}{\ifthenelse{\x=1 \OR \x>3}{0}{\zb}}{\zt}$}
}
};
\end{document}
Isso deve criar a terceira grade desejada.
Veja também a resposta à seguinte pergunta para mais exemplos com ifthenelse e loops: If-then-else dentro do gráfico TikZ?
Responder2
Você pode usar no TikZ a frase "atribuição condicional", que você provavelmente conhece da linguagem C. A sintaxe é result = cond?v0:v1
. Se a condição cond
for verdadeira, v0
será atribuído a result
, caso contrário, v1
será atribuído.
Esta expressão pode ser usada como parte da evaluate
chave no seu código. Além disso, a expressão pode ser aninhada dentro de outra atribuição condicional, como por exemplo:result = cond1?(cond2?v0:v1):v2
Então, no seu caso (código adaptado da resposta de val):
\documentclass[border=1cm]{standalone}
\usepackage{tikz}
\begin{document}
\def\n{4}
\def\m{4}
\def\s{1.5cm}
\noindent\tikz\draw grid[step=\s](\n*\s,\m*\s)
foreach[evaluate] \x in {1,...,\n} {
foreach[evaluate={
\zt = int(\x+\n*min(\y-1,\m+\y));
\zb = int(\x+(\n-2)*min(\y-1,\m+\y)+3);
\zr = \y>2?((\x==1)||(\x>3)?0:\zb):\zt % <-------- see here
}] \y in {1,...,\m} {
({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{\zr}
}
};
\end{document}
O que produz:
Responder3
Poderíamos usar as funções de comparação/matemática lógica depgf
(89.3.5 Comparação e funções lógicas no manual 3.0.1a), como equal(x,y)
which retorna 0
if x
e y
not are equal e caso contrário retorna 1
, e greater(x,y)
which retorna 1
if x>y
e else 0
e incorpore-os em suas evaluate
instruções junto com as funções min
and .max
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\def\n{4}
\def\m{6}
\def\blnk{1}
\def\mx{8}
\def\s{1.5cm}
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach \x in {1,...,\n}
{ foreach[evaluate={\z = int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))}] \y in {1,...,\m}
{({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};
\tikz\draw grid[step=\s](\n*\s,\m*\s) foreach \x in {1,...,\n}
{ foreach[evaluate={\z = int(notless(\n*(\y-1),\mx)*greater(min(\x-\blnk,\n+1-\x-\blnk),0)*((\n-2*\blnk)*(\y-ceil(divide(\mx,\n))-1) +\x-\blnk+\n*ceil(divide(\mx,\n)))+less(\n*(\y-1),\mx)*(\n*(\y-1)+\x))}] \y in {1,...,\m}
{({\s*(.5+(\x-1))},{\s*(\m+.5-\y)}) node{$a=\z$}}};
\end{document}
Para o seu primeiro exemplo, a função int(divide(\n,2)*(\y-1)+min(\x,\n+1-\x))
parece corresponder ao seu primeiro exemplo, não exigindo realmente nenhuma condição, apenas a min
função com um termo +\x
and apropriado.-\x
A natureza por partes é introduzida através do uso de funções notless
e greater
que atuam como multiplicadores do número real de juros, que têm o mesmo tipo de efeito que as condicionais que você procurava.
Pode-se imaginar um caso mais geral que descreva o seu segundo caso, que imprime todos os números até a linha em que \mx
ocorre, após o que coloca um número \blnk
de zeros como preenchimento em ambos os lados enquanto aumenta continuamente para o que a int(notless(\n*(\y-1),\mx)*greater(min(\x-\blnk,\n+1-\x-\blnk),0)*((\n-2*\blnk)*(\y-ceil(divide(\mx,\n))-1)+\x-\blnk+\n*ceil(divide(\mx,\n)))+less(\n*(\y-1),\mx)*(\n*(\y-1)+\x))
função parece fazer o trabalho, ceil
arredonda para o número inteiro mais próximo.
Para um caso mais mínimo de representar apenas a função que você deseja int(notless(\y,3)*greater(min(\x-1,\n-\x),0)*((\n-2)*(\y-3)+\x+7)+less(\y,3)*(4*(\y-1)+\x))
funcionar, novamente usando a função notless and
less to separate into two cases, and the
min function inside the
maior` para identificar quais colunas devem ter zero.