
Я пытаюсь понять поведение, при котором заголовки разделов принимают цвет первого слова в разделе.
Вот мой MWE:
\documentclass{minimal}
\usepackage{xcolor}
\makeatletter
\newcommand\section{\@startsection{section}{1}{.25in}%
{1.3ex \@plus .5ex \@minus .2ex}%
{-.5em \@plus -.1em}%
{\reset@font\normalsize\bfseries}}
\makeatother
\begin{document}
\section{First}
{\color{red} Hello there} More text
\end{document}
Желаемый результат — чтобы «Hello there» было красным, а остальной текст (включая «First») — черным. Однако «First» — красный. Если слово вставлено перед «{\color», то происходит желаемое поведение. Что здесь происходит? Ответ должен заключаться в каком-то базовом факте о латексе, который я не знаю.
Спасибо заранее.
решение1
Во-первых, скажем, что проблема не имеет никакого отношения к определению \section
. Так что проблема не здесь, а в использовании \color{red}...
вместо \textcolor{red}{...}
.
Вот MWE, который воспроизводит проблему
\documentclass{article}
\usepackage{color}
\begin{document}
\paragraph{Foo}
{\color{red}Bar} bla bla
\end{document}
Почему?
Если пятый аргумент \@startsection
отрицательный, заголовок добавляется к абзацу следующего текста с \everypar
командой. Команда \everypar
выполняется в горизонтальном режиме, т.е. когда TeX видит символ H в Hello, но в этот момент уже слишком поздно, и изменение цвета уже выполнено. Вот еще один пример
\documentclass{article}
\usepackage{color}
\begin{document}
\everypar{Foo \everypar{}}
{\color{red}\ifvmode\hrule\vskip1cm\fi Bar} bla bla
\end{document}
Решение — использовать \textcolor{red}{...}
или \leavevmode{\color{red}...}
.