연속된 줄바꿈 병합

연속된 줄바꿈 병합

나는 다음과 같은 것을 가지고 있습니다 :

%\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}

관련 정보