Подавить отступ после среды в LaTeX - PullRequest
4 голосов
/ 29 апреля 2010

Я пытаюсь создать новую среду в своем документе LaTeX, в которой отступ в следующем абзаце после среды исключен.

Мне сказали (источник TeXbook и LaTeX), что, установив \everypar в {\setbox0\lastbox}, наборщик TeX выполнит это в начале следующего абзаца и, таким образом, удалит отступ:

\everypar{\setbox0\lastbox}

Так вот, что я делаю, но безрезультатно (следующий абзац все еще с отступом):

\newenvironment{example}
  {\begin{list}
     {}
     {\setlength\leftmargin{2em}}}
  {\end{list}\everypar{\setbox0\lastbox}}

Я изучил внутренности LaTeX так хорошо, как мог. Кажется, что в какой-то момент процедура \end говорит \endgroup и \par, что может быть причиной того, что LaTeX игнорирует мою настройку \everypar. \global тоже не помогает. Я знаю о \noindent, но хочу сделать это автоматически.

Пример фрагмента документа:

This is paragraph text. This is paragraph text, too.

\begin{example}
  \item This is the first item in the list.
  \item This is the second item in the list.
\end{example}

This is more paragraph text. I don't want this indented, please.

Внутренние процедуры и переключатели, представляющие интерес, кажутся \@endpetrue, \@endparenv и другими. Спасибо за вашу помощь.

Ответы [ 9 ]

3 голосов
/ 30 апреля 2010

Я ничего не мог заставить работать без переопределения \end, но я, конечно, не эксперт.

Следующее довольно странно, но сработало в моем ограниченном тестировании. Конечно, это будет мешать вложенным средам (у вас должна быть возможность переопределить \begin для восстановления старого \end, если у вас есть проблемы).

\newenvironment{example}{%
  \bgroup
  \let\oldend=\end
  \def\end##1{\oldend{##1}\csname @afterindentfalse\endcsname
                          \csname @afterheading\endcsname}
  \begin{list}{}
    {\setlength\leftmargin{2em}}
  }{%
  \end{list}
  \egroup
}
2 голосов
/ 03 июля 2012

Что-то настолько простое, как это работает для меня:

\makeatletter
\newenvironment{example}{%
  \bgroup
    \list{}{}
}{%
    \endlist
    \@afterindentfalse
    \@afterheading
  \egroup
}
\makeatother

Но это не работает до того, как первый \ раздел (или \ глава, в случае классов "book" и "report") вызывается Я не знаю почему.

2 голосов
/ 30 апреля 2010

Разве вы не можете избежать этого, не имея пустой строки между вашей средой и следующей строкой?

This is paragraph text. This is paragraph text, too.

\begin{example}
  \item This is the first item in the list.
  \item This is the second item in the list.
\end{example}
% (No blank line)
This is more paragraph text. I don't want this indented, please.
1 голос
/ 16 октября 2017

Вы можете сделать это без переопределения \end

\makeatletter
\newenvironment{example}
   {\begin{list}
      {}
      {\setlength\leftmargin{2em}}}
   {\end{list}%
    \def\if@endpe{%
      \@doendpe
      \let\par\@@par
      \iffalse}}
\makeatother

Объяснение

\end изменяется \everypar после расширения \endexample. Чтобы сделать вещи еще более сложными, он устанавливает \par для восстановления \everypar{}. Очевидно, \@doendpe предназначен для того, чтобы гарантировать отсутствие отступа, если абзац продолжается после среды, но для восстановления нормального поведения, если после среды есть \par (или пустая строка).

Возможно, вы захотите избежать изменения \end, поскольку его нужно будет изменить в начале среды и, следовательно, он может нарушить условия вложенной среды. К счастью, определение \end содержит \expandafter\endgroup\if@endpe. Мы можем использовать \if@endpe в качестве хука, чтобы внедрить наш код во внешнюю область. После \endgroup \if@endpe автоматически восстанавливается.

1 голос
/ 05 сентября 2011

Я попробовал ответ Ивана , но он не работал для меня. Но я все заработал! Вот что я сделал:

\makeatletter
\renewenvironment{quotation}{% 
\bgroup%
\let\oldend=\end%
\def\end##1{\oldend{##1}\csname @afterindentfalse\endcsname%
                        \csname @afterheading\endcsname}%
\list{}{\listparindent 1.5em%
\itemindent    \listparindent%
\leftmargin 1.5em%               This controls the size of the indentation
\rightmargin   \leftmargin
\parsep        \z@ \@plus\p@}%      This line reduces inter-paragraph space to normal values.
\item\relax%
}{%
\endlist%%
\egroup%
}
\makeatother

Преимущество этого состоит в том, что он очень хорошо печатает ваши цитаты и удаляет отступ от абзаца после цитаты.

0 голосов
/ 22 апреля 2016

У меня была такая же проблема. Я просто использовал это:

\noindent \newenvironment
0 голосов
/ 07 августа 2011

завершение вашей среды с помощью \ noindent может вам помочь

0 голосов
/ 10 июня 2010

Включите \ @afterindentfalse \ @afterheading в конце вашего определения.

0 голосов
/ 29 апреля 2010

Не следует связываться со списком токенов \everypar, если вы точно не знаете, что делаете. Используйте

\setlength{\parindent}{0pt}

чтобы избавиться от отступов во всем документе.

...