
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á \thing
s. Se houvesse \thing1
e \thing2
isso 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}abc
identificaria '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\fi
a que se expande para o caso else, obviamente, ou seja a
; portanto: \maybehide{xyz}abc
--> "abc". No caso de uso real, ' \maybehide{xyz}\\...
' \maybehide
seria 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}