\obeylines가 활성화된 경우 블록 사이에 자동 수직 공백 삽입

\obeylines가 활성화된 경우 블록 사이에 자동 수직 공백 삽입

\obeylines가끔 말하기를 위해 LaTeX로 원고를 작성할 때, 그 일부를 다음 과 같이 형식화하여 \obeyspaces하나의 일관된 생각이 각 줄에 간결하게 표현되고 줄 사이의 관계가 다음과 같이 선행 들여쓰기로 표현될 수 있도록 하고 싶습니다 .

One thought introduced with a coherent phrase,
    followed by a subordinate phrase,
    and a coordinate subordinate phrase.

Then a second thought introduced ...

내가 겪는 문제는 위의 마지막 줄 앞과 같이 연속된 줄 그룹("단락") 사이에 추가 수직 간격을 포함하는 것입니다. 지금까지 내가 생각해낸 가장 좋은 임시 조치는 다음과 같이 각 그룹의 끝에 추가할 수 있는 파이프 기호를 정의하는 것입니다.... coordinate subordinate phrase.|

재정의 코드는 다음과 같으며 외부 패키지에 배치했습니다.

\catcode`|=\active
\def|{\smallskip}

이것은 원하는 대로 어느 정도 작동하지만 소스 텍스트 전체의 파이프 문자는 짜증나고 분명히 해결 방법입니다.

그래서 나는 추가 간격을 위한 파이프 문자를 요구하지 않고 내가 원하는 것을 달성하는 환경을 정의하려고 노력해 왔습니다. 이것이 내가 지금까지 가지고 있는 것입니다...

\newenvironment{linewise}{%
\let\@oldpar=\par \let\par=\newpar \obeylines \let\par=\@oldpar}
{}

이 방향으로 나아가면 어떻게 \newpar정의해야 할까요? 를 사용해 보았 \\으나 빈 줄(보통 삽입되는 곳)의 끝에 자동으로 삽입되면 TeX가 작동하지 \par않고 이전 단락을 끝내지 않습니다(문자가 이기 때문인 \active것으로 추정됩니다). 하려고 노력 중이야.

내가 알 수 있는 한, 문제는 두 개 이상의 반환 문자에서 단락 사이의 구분이 TeX의 입에서 발생한다는 것입니다. 여기서 두 개의 반환 문자가 있는 곳에 삽입하려는 수직 공간을 구별하는 조정을 할 수 없습니다. 이상의 반환 문자와 줄 바꿈(또는 새 단락)이 하나만 있을 때 삽입하려는 경우입니다.

아니면 이를 수행하는 더 좋은 방법이 있습니까?

답변1

를 재정의해서는 안 되지만 \par. 뒤에 활성 줄 끝이 있어야 합니다 \obeylines.

\documentclass{article}
\newenvironment{linewise}
  {\parindent=0pt
   \obeyspaces\obeylines
   \begingroup\lccode`~=`\^^M
   \lowercase{\endgroup\def~}{\par\leavevmode}}
  {\ignorespacesafterend}

\begin{document}
\noindent X\leaders\hrule\hfill X

\begin{linewise}
One thought introduced with a coherent phrase,
    followed by a subordinate phrase,
    and a coordinate subordinate phrase.

Then a second thought introduced ...
\end{linewise}
Something after
\end{document}

여기에 이미지 설명을 입력하세요

답변2

얼마 후, 나는 내가 하려고 했던 일에 대한 더 나은 해결책을 찾았습니다. 이는 명령이 있는 eTeX에서 차용한 것입니다 \obeywhitespace. 나는 필요할 때 사용할 수 있는 패키지에 필요한 정의(분명히 작동하지만 일부는 꽤 복잡해 보이지만)를 넣었습니다. 아래에 관련 패키지 내용을 포함하겠습니다.

끝에는 \setblankskip원래 질문에 표시된 대로 "단락" 사이의 간격을 조정할 수 있는 명령이 있습니다.

또한 이 동작은 이라는 환경 내에서 제공됩니다 linewise. 유일하게 남아 있는 짜증나는 점은 linewise환경 내의 최종 개행 문자가 빈 출력 행에 반영된다는 것입니다. 이는 마지막 개행 앞에 %.

\def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
\def\gobble#1{}%
\newskip\blanklineskipamount
\blanklineskipamount = -.8\baselineskip
\begingroup
   \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on.
\gdef\obeywhitespace{%
\makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}%
\makeactive\ \def {\ }%
\aftergroup\@removebox%
\futurelet\next\@finishobeywhitespace%
}%
\gdef\@finishobeywhitespace{{%
\ifx\next %
\aftergroup\@obeywhitespaceloop%
\else\ifx\next^^M%
\aftergroup\gobble%
\fi\fi}}%
\gdef\@finishobeyedreturn{%
\ifx\next^^M\vskip\blanklineskipamount\fi%
\indent%
}%
\endgroup
\def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}%
\def\@removebox{%
   \setbox0 = \lastbox
   \ifdim\wd0=\parindent
     \setbox2 = \hbox{\unhbox0}%
     \ifdim\wd2=0pt
       \ignorespaces
     \else
       \box2 % Put it back: it wasn't empty.
     \fi
   \else
      \box0 % Put it back: it wasn't the right width.
   \fi
}%
\newenvironment{linewise}{\begingroup\obeywhitespace}{\endgroup}%
% By default, a blank line will result in .2\baselineskip.  This allows
% other values to be set
\RequirePackage{calc}
\newcommand{\setblankskip}[1]{\setlength{\blanklineskipamount}{-\baselineskip+#1}}

관련 정보