Mesclar quebras de linha consecutivas

Mesclar quebras de linha consecutivas

Eu tenho algo assim:

%\newcommand{\maybehide}[1]{#1}
\newcommand{\maybehide}[1]{}
\newcommand{\thing}[1]{#1}
\newcommand{\bigthing}[1]{#1}

\bigthing{  
\thing{1}\\
  \maybehide{\thing{2}}\\
  \thing{3}
}

e eu gostaria que ele se comportasse como

\bigthing{
  \thing{1}\\
  \thing{3}
}

mas se comporta como

  \bigthing{
    \thing{1}\\
    \\
    \thing{3}
  }

Existe alguma maneira de fazer isso?

A única maneira de fazer isso que consegui pensar é redefinir \\para que redefina \\não fazer nada e, em seguida \thing, redefinir \\como deveria ser.

  \let\mylinebreak\\
  \let\mything\thing

  \def\mynewlinebreak{
    \def\\{}
    \mylinebreak  
  }
  \def\mynewthing{
    \def\\{\mynewlinebreak}
    \mything
  }

  \def\\{\mynewlinebreak}
  \def\thing{\mynewthing}

  \bigthing{
    \thing{1}\\
    \maybehide{\thing{2}}\\
    \thing{3}
  }

Mas realmente parece um hack que acabaria quebrando alguma coisa, então eu realmente prefiro outro método. E também tem o fato de que depende de eu saber que haverá \things. Se houvesse \thing1e \thing2isso pudesse ser alternativo, eu teria que adicionar mais algum código e se não sei o que pode estar lá, não funcionaria de jeito nenhum ...

Agradeço antecipadamente por sua ajuda.

Responder1

Seu hack não é tão ruim. Mas você pode fazer isso de forma mais rápida e sem necessidade de redefinição \\.

A solução a seguir define a versão gobble \maybehide(aquela que você ativa caso queira ocultar o conteúdo) com dois argumentos e verifica se o segundo argumento é igual \\. Se for verdade, será consumido; se for falso, imprimirá qualquer que seja o segundo argumento:

\newcommand{\maybehide}[2]{\ifx\\#2\else#2\fi}

Por exemplo: \maybehide{xyz}abcidentificaria 'xyz' como o primeiro argumento que é esquecido de qualquer maneira (não ocorre no texto de substituição) e 'a' como o segundo argumento. Portanto, a primeira expansão é \ifx\\a\else a\fia que se expande para o caso else, obviamente, ou seja a; portanto: \maybehide{xyz}abc--> "abc". No caso de uso real, ' \maybehide{xyz}\\...' \maybehideseria encontrado \\como segundo argumento, portanto, o teste se expande para o caso verdadeiro que está vazio; isso significa \\que é jogado fora e \maybehide{xyz}\\não produz nada.

O exemplo completo:

\documentclass{article}

\parindent0pt

\makeatletter
%\newcommand{\maybehide}[1]{#1}
\newcommand{\maybehide}[2]{\ifx#2\\\else#2\fi}% in case you wanna hide
\newcommand{\thing}[1]{#1}
\newcommand{\bigthing}[1]{#1}
\makeatother

\begin{document}
\bigthing{%
  \thing{1}\\
  \maybehide{\thing{2}}\\
  \thing{3}
}
\end{document}

então compila para algo como

1
3

em vez de

1

3

Para uma solução mais geral que seja independente de suas macros específicas, você também pode redefinir \\. Algo como

\def\\#1{\ifx\\#1\newline\else\newline#1\fi}

é essencialmente o que é necessário (e usa exatamente a mesma abordagem da solução especial acima). Existem duas advertências agora: (1) \\pode significar coisas diferentes de acordo com o ambiente e (2) o argumento opcional é perdido.

  • anúncio (1): As coisas fáceis primeiro. Armazene o significado original, \let\ltx@nl=\\e\def\\#1{\ifx\\#1\ltx@nl\else\ltx@nl#1\fi}
  • ad (2): Um argumento opcional cujo padrão é '0pt' é basicamente suficiente: \renewcommand{\\}[2][0pt]{\ifx\\#2\expandafter\ltx@nl\else\ltx@nl[#1]#2\fi}. Isso também garante que qualquer argumento opcional do supérfluo \\não seja impresso na saída, por exemplosome text\\ \\[3pt] some other text não vaiser convertido para

algum texto

[3pt] algum outro texto

Uma última observação: o segundo ponto poderia ser feito ainda melhor. Tal como está, o argumento opcional da linha devorada será usado. Mas eu diria que é desejável esquecer também o argumento opcional. Para isso você precisa de outra macro auxiliar que chame a \\versão armazenada com o argumento opcional da chamada original de \\:

\newcommand{\ltx@nl@}[1][]{\ltx@nl[\@tempa]}% \@tempa will hold the optional argument of \\
\renewcommand{\\}[2][0pt]{%
  \def\@tempa{#1}%
  \ifx\\#2
    \expandafter\ltx@nl@
  \else
    \ltx@nl[#1]#2
  \fi}

Um exemplo completo para verificar todos os casos:

\documentclass{article}

\parindent0pt

\makeatletter
\let\ltx@nl=\\
\renewcommand{\\}[2][0pt]{%
  \def\@tempa{#1}%
  \ifx\\#2
    \expandafter\ltx@nl@
  \else
    \ltx@nl[#1]#2
  \fi}
\newcommand{\ltx@nl@}[1][]{\ltx@nl[\@tempa]}
\makeatother

\begin{document}
some text\\[16pt]  %linebreak with 16pt vertical offset
\\[4pt]            %will be forgotten completely
someother text\\   %regular forced linebreak
hello world
\end{document}

informação relacionada