Existe uma maneira correta de evitar que um recorte de galera se repita posteriormente sem modificar o corpo do documento?

Existe uma maneira correta de evitar que um recorte de galera se repita posteriormente sem modificar o corpo do documento?

Considere o seguinte FMWE (Exemplo de Trabalho Bastante Mínimo):

\documentclass[a4paper]{article}
\usepackage{kantlipsum,xgalley}
\usepackage[scale=.8]{geometry}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentCommand\resetindents { }
{
  \galley_parshape_set_multi:nnnN { 0 } { 0pt } { 0pt } \c_true_bool
}
\NewDocumentCommand\cutleft { m m }
{
  \galley_cutout_left:nn { #1 } { #2 }
}
\NewDocumentCommand\cutright { m m }
{
  \galley_cutout_right:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
% \ExplSyntaxOn
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.

\kant[4]

\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}
\kant[5]
% \resetindents

\kant[6-7]

% \ExplSyntaxOff
\end{document}

A saída esperada por mim deste código é

esperado

A saída real é

real

Existe uma maneira correta de alcançar o resultado esperado sem modificar o corpo do documento?

Observe que qualquer uma das duas modificações a seguir no corpo é suficiente para alcançar o resultado desejado:

  1. descomente a linha

    % \resetindents
    
  2. descomente as linhas

    % \ExplSyntaxOn
    

    e

    % \ExplSyntaxOff
    

é por isso que essas linhas estão na fonte.

No entanto, apenas \resetindentsparece realmente resolver o problema, pois o exemplo a seguir também fornece a saída real e indesejada.

\begin{document}
\ExplSyntaxOn
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]
\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}
\kant[5]
% \resetindents
\kant[6-7]
\ExplSyntaxOff
\end{document}

Aparentemente, a remoção das linhas em branco da fonte impede que a mudança para expl3a sintaxe evite o problema. Além disso

\begin{document}
\ExplSyntaxOn
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]\par
\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}
\kant[5]\par
% \resetindents
\kant[6-7]\par
\ExplSyntaxOff
\end{document}

também demonstra o problema.

Portanto, \resetindentsparece ser necessário, mas eupensarque a filosofia das galeras sugere que não deveria ser assim.

Estou curioso para saber como é determinado o padrão dos cortes. Por exemplo,

\begin{document}
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]

\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}

\kant[5-6]

\kant[7]
\end{document}

não repete o corte até o parágrafo final

apenas final

enquanto

\begin{document}
\cutleft{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.\par
\kant[4]

\cutright{4}{25mm,25mm,25mm,25mm,25mm,25mm}

\kant[5]

\kant[6]

\kant[7]
\end{document}

repete o corte nos dois parágrafos finais

dois últimos

Em nenhum caso o corte mais recente é repetido, pois isso produziria um corte à direita. O que parece crucial é que o corte repetido abranja mais de um único parágrafo.

\begin{document}
\cutright{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.
Perhaps we should make it a bit longer just to see what happens to things in that case.\par
\kant[4]

\cutleft{4}{25mm,25mm,25mm,25mm,25mm,25mm}

\kant[5]

\kant[6]

\kant[7]
\end{document}

corte novamente à direita

No entanto, pelo menos o efeito não é cumulativo.

\begin{document}
\cutright{0}{25mm,25mm,25mm,25mm,25mm,25mm,25mm,25mm}
This is an extremely short paragraph.
Perhaps we should make it a bit longer just to see what happens to things in that case.\par
\kant[4]

\cutleft{4}{25mm,25mm,25mm,25mm,25mm,25mm}
This is another extremely short paragraph.

\kant[5]

\kant[6]

\kant[7]
\end{document}

cortes repetidos não cumulativos

Por favor, note que

  • Eu sei perfeitamente que isso l3galleyé experimental e que espera-se que ele quebre se você tentar usá-lo de todas as maneiras estranhas e maravilhosas. Considere esta uma aventura guiada por uma pequena parte das estranhezas e maravilhas que resultam.

  • Também estou ciente de que a estranheza e o espanto estão muito nos olhos de quem vê. É perfeitamente possível que o efeito que considero inesperado seja, na verdade, um recurso de design altamente valorizado pelos desenvolvedores que passaram longas horas sobre um teclado quente tentando desesperadamente fazer com que os recortes se repetissem de acordo com um algoritmo preciso, por mais obscuro que fosse seu padrão. pode ser para mim. TeX é Mistério (de que outra forma descrever a convocação de espíritos tipográficos por estranhas misturas de letras minúsculas e maiúsculas?) e eu ficaria desapontado se esse mistério desaparecesse completamente em seus descendentes.

Responder1

Isso ocorreu devido a um bug no l3galley. Na demonstração, o recorte \parshapeé configurado no nível superior, então o recorte é 'usado' dentro de um grupo (invisível aqui, mas presente como \kantse aplica \pardentro de um grupo). Após o grupo, o \parshapenão foi redefinido, pois l3galleynão foram necessárias tentativas de evitar isso (não há recorte realmente presente e nenhuma outra margem ou o que quer que esteja sendo configurado).

O código agora foi modificado para detectar que o recorte ainda está 'ativo' e requer \parshapeconfiguração se \parocorrer e não estiver no nível superior do grupo. Esta correção aparecerá na próxima expl3atualização, provavelmente no final desta semana (meados de junho de 2016).

informação relacionada