Центрирование внутри мини-страницы

Oct 07 2020
\documentclass{article}
\makeatletter
\newenvironment{myquote}[1]{%
  % to change text size, say to small
  % add \small before \par in the next line
  \par\addvspace{2ex}
  \if@nobreak
    % we're at the start of a section
    % add the indent
    \if@afterindent\else\hspace*{\parindent}\fi
    % and instruct LaTeX to reset \@afterheading at the end
    \def\reset@nobreakatend{\@afterheading}%
  \else
    \def\reset@nobreakatend{}%
  \fi
  \begin{minipage}{\dimexpr\linewidth -2\parindent\relax}%
    \def\myquoteauthorname{#1}%
  }{%
    \par\vspace{0.2ex}
    \noindent
    \hspace*{0.25\linewidth}%
      \rule{0.5\linewidth }{.4pt}
    \par\addvspace{1ex}
    \centering
    \textbf{\myquoteauthorname}\par\vspace{1ex}
  \end{minipage}
  \par\nobreak\reset@nobreakatend}
\makeatother


\begin{document}
\begin{myquote}{Diane Ravitch}
The person who knows ``how'' will always have a job. The person who knows ``why'' will always be his boss.
\end{myquote}


\begin{myquote}{Diane Ravitch}
\centering
The person who knows ``how'' will always have a job. The person who knows ``why'' will always be his boss.
\end{myquote}

\begin{myquote}{Diane Ravitch}
\begin{center}
    The person who knows ``how'' will always have a job. The person who knows ``why'' will always be his boss.
\end{center}
\end{myquote}
\end{document}

В приведенном выше коде (исходный ответ @egreg) я хочу центрировать текст внутри minipage. Если я использую \centeringправило движется; если использую \begin{center} \end{center}, то получаю вертикальное пространство.

  1. Как я могу центрировать текст, не перемещая линейку и не оставляя лишнего вертикального пространства?
  2. Как получить альтернативную версию расположения myquoteтекста по центру? (Я пытался поместить \centeringвнутрь в различных точках, но во всех них правило также изменилось.)

Ответы

2 campa Oct 07 2020 at 15:00

Я бы сказал, что самое простое решение - добавить дополнительную группу, которая ограничивает эффект любого объявления, которое вы пишете в теле окружения.

\documentclass{article}
\makeatletter
\newenvironment{myquote}[1]{%
  % to change text size, say to small
  % add \small before \par in the next line
  \par\addvspace{2ex}
  \if@nobreak
    % we're at the start of a section
    % add the indent
    \if@afterindent\else\hspace*{\parindent}\fi
    % and instruct LaTeX to reset \@afterheading at the end
    \def\reset@nobreakatend{\@afterheading}%
  \else
    \def\reset@nobreakatend{}%
  \fi
  \begin{minipage}{\dimexpr\linewidth -2\parindent\relax}%
    \def\myquoteauthorname{#1}%
    \begingroup   % <-- ADD THIS
  }{%
    \par\endgroup\vspace{0.2ex}  % <-- ADD \endgroup HERE
    \noindent
    \hspace*{0.25\linewidth}%
      \rule{0.5\linewidth }{.4pt}
    \par\addvspace{1ex}
    \centering
    \textbf{\myquoteauthorname}\par\vspace{1ex}
  \end{minipage}
  \par\nobreak\reset@nobreakatend}
\makeatother


\begin{document}

\begin{myquote}{Diane Ravitch}
\centering
The person who knows ``how'' will always have a job. The person who knows ``why'' will always be his boss.
\end{myquote}

\begin{myquote}{Diane Ravitch}
\itshape
The person who knows ``how'' will always have a job. The person who knows ``why'' will always be his boss.
\end{myquote}

\end{document}