Código para renderizar poliominós incorreto para uma linha

Código para renderizar poliominós incorreto para uma linha

Estou usando código (muito ligeiramente) adaptado deesta respostapara renderizar poliominós. Funciona muito bem, exceto por dois problemas.

  1. O comprimento dos poliominós com apenas uma linha não parece ser levado em consideração.

  2. A segunda questão é que sempre preciso preencher a primeira linha com espaçadores para que o espaçamento funcione corretamente. (Isso é apenas um inconveniente, portanto não tão crítico quanto o primeiro problema).

Alguém sabe como posso consertar isso?

Aqui está um exemplo mínimo:

\documentclass{article}

\makeatletter

\def\omino#1{{%
        \unitlength6\p@
        \@tempcnta\z@
        \@tempcntb\@ne
        \count@\z@
        \xomino#1\relax
        \begin{picture}(\@tempcnta,\@tempcntb)(0,-\@tempcntb)%
        \@tempcnta\z@
        \@tempcntb\@ne
        \count@\z@
        \xxomino#1\relax
        \end{picture}%
    }%
}

\def\xomino#1{%
    \ifx\relax#1%
    \else
    \ifx\\#1%
    \ifnum\count@>\@tempcnta \@tempcnta\count@\fi
    \advance\@tempcntb\@ne
    \count@\z@
    \else
    \advance\count@\@ne
    \fi
    \expandafter\xomino
    \fi}

\def\xxomino#1{%
    \ifx\relax#1%
    \else
    \ifx\\#1%
    \advance\@tempcntb\@ne
    \count@\z@
    \else
    \advance\count@\@ne
    \ifx*#1%
    \put(\count@,-\@tempcntb){\kern-6pt\framebox(0.93,0.93)}
    \fi
    \fi
    \expandafter\xxomino
    \fi}

\makeatother

\begin{document}
Polyominoes with two or more rows like this \omino{*****\\*\\*} 
work great, but polyominoes that have only one row like this 
\omino{******} don't align properly. 

Also, the first row needs to be complete, like this \omino{*...\\****} 
to work. Without the empty characters, the polyomino is not spaced 
correctly, like \omino{*\\****}this. 

\end{document}

insira a descrição da imagem aqui

Responder1

O problema é que o cálculo dos passos horizontais máximos não leva em consideração a última linha. Pode-se corrigir isso adicionando o cálculo máximo do \\caso ao \relaxcaso. A alteração está marcada com um %<-.

\documentclass{article}

\makeatletter

\def\omino#1{{%
        \unitlength6\p@
        \@tempcnta\z@
        \@tempcntb\@ne
        \count@\z@
        \xomino#1\relax
        \begin{picture}(\@tempcnta,\@tempcntb)(0,-\@tempcntb)%
        \@tempcnta\z@
        \@tempcntb\@ne
        \count@\z@
        \xxomino#1\relax
        \end{picture}%
    }%
}

\def\xomino#1{%
    \ifx\relax#1%
    \ifnum\count@>\@tempcnta \@tempcnta\count@\fi%<-
    \else
    \ifx\\#1%
    \ifnum\count@>\@tempcnta \@tempcnta\count@
    \fi
    \advance\@tempcntb\@ne
    \count@\z@
    \else
    \advance\count@\@ne%
    \fi
    \expandafter\xomino
    \fi}

\def\xxomino#1{%
    \ifx\relax#1%
    \else
    \ifx\\#1%
    \advance\@tempcntb\@ne
    \count@\z@
    \else
    \advance\count@\@ne
    \ifx*#1%
    \put(\count@,-\@tempcntb){\kern-6pt\framebox(0.93,0.93)}
    \fi
    \fi
    \expandafter\xxomino%
    \fi}

\makeatother

\begin{document}
Polyominoes with two or more rows like this \omino{*****\\*\\*} 
work great, but polyominoes that have only one row like this 
\omino{******} don't align properly. 

Also, the first row needs to be complete, like this \omino{*...\\****} 
to work. Without the empty characters, the polyomino is not spaced 
correctly, like \omino{*\\****} this. 

\end{document}

insira a descrição da imagem aqui

informação relacionada