
나는 다음과 같은 것을 가지고 있습니다 :
%\newcommand{\maybehide}[1]{#1}
\newcommand{\maybehide}[1]{}
\newcommand{\thing}[1]{#1}
\newcommand{\bigthing}[1]{#1}
\bigthing{
\thing{1}\\
\maybehide{\thing{2}}\\
\thing{3}
}
그리고 나는 그것이 다음과 같이 행동하기를 바랍니다
\bigthing{
\thing{1}\\
\thing{3}
}
하지만 그것은 다음과 같이 행동합니다
\bigthing{
\thing{1}\\
\\
\thing{3}
}
그렇게 할 수 있는 방법이 있나요?
내가 생각할 수 있는 유일한 방법은 아무것도 하지 않도록 재정의 \\
한 다음 에서 그것이 무엇이어야 하는지 재정의하는 것 입니다.\\
\thing
\\
\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}
}
하지만 결국 뭔가를 망칠 해킹처럼 보이므로 다른 방법을 선호합니다. 그리고 그것이 있을 것이라는 사실을 아는 것이 나에게 달려 있다는 사실도 있습니다 \thing
. 그것이 있고 대체할 수 \thing1
있다면 \thing2
코드를 더 추가해야 하고 거기에 무엇이 있을 수 있는지 모른다면 전혀 작동하지 않을 것입니다...
당신의 도움에 미리 감사드립니다.
답변1
당신의 해킹은 그리 나쁘지 않습니다. 하지만 이 방법을 재정의할 필요 없이 더 빠르게 수행할 수 있습니다 \\
.
다음 솔루션은 두 개의 인수를 사용하여 gobble 버전 \maybehide
(콘텐츠를 숨기려는 경우 활성화하는 버전)을 정의하고 두 번째 인수가 같은지 확인합니다 \\
. true이면 먹어치워지고, false이면 두 번째 인수가 무엇이든 인쇄됩니다.
\newcommand{\maybehide}[2]{\ifx\\#2\else#2\fi}
예를 들어, \maybehide{xyz}abc
어쨌든 잊혀진 첫 번째 인수로 'xyz'를 식별하고(대체 텍스트에서는 발생하지 않음) 'a'를 두 번째 인수로 식별합니다. 따라서 첫 번째 확장은 \ifx\\a\else a\fi
분명히 else 사례로 확장됩니다. 즉 a
, ; 따라서: \maybehide{xyz}abc
--> "abc". 실제 사용 사례에서는 ' \maybehide{xyz}\\...
'가 두 번째 인수로 \maybehide
발견되므로 \\
테스트는 비어 있는 실제 사례로 확장됩니다. 즉, 의미는 \\
버려지고 \maybehide{xyz}\\
아무 것도 출력되지 않습니다.
전체 예:
\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}
그런 다음 다음과 같이 컴파일됩니다.
1
3
대신에
1
3
특정 매크로와 별개인 보다 일반적인 솔루션을 위해 물론 재정의할 수도 있습니다 \\
. 다음과 같은 것
\def\\#1{\ifx\\#1\newline\else\newline#1\fi}
본질적으로 필요한 것입니다(그리고 위의 특수 솔루션과 정확히 동일한 접근 방식을 사용합니다.). 이제 두 가지 주의 사항이 있습니다. (1) \\
주변 환경에 따라 다른 것을 의미할 수 있으며 (2) 선택적 인수가 손실됩니다.
- 광고 (1): 쉬운 것부터 먼저. 원래 의미를 저장하고
\let\ltx@nl=\\
,\def\\#1{\ifx\\#1\ltx@nl\else\ltx@nl#1\fi}
- 광고 (2): 기본값이 '0pt'인 선택적 인수는 기본적으로 충분합니다
\renewcommand{\\}[2][0pt]{\ifx\\#2\expandafter\ltx@nl\else\ltx@nl[#1]#2\fi}
. 이는 또한 superflous의 선택적 인수가\\
출력에 인쇄되지 않도록 보장합니다.some text\\ \\[3pt] some other text
습관로 변환되다
일부 텍스트
[3pt] 다른 텍스트
마지막 발언: 두 번째 사항은 더 잘 수행될 수 있습니다. 현재로서는 중얼 라인의 선택적 인수가 사용됩니다. 그러나 선택적 인수도 잊어버리는 것이 바람직하다고 말하고 싶습니다. 이를 위해서는 \\
원래 호출의 선택적 인수를 사용하여 저장된 버전을 호출하는 또 다른 도우미 매크로가 필요합니다 \\
.
\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}
모든 사례를 확인하는 완전한 예:
\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}