LaTex: запустить команду в начале окружения и завершить ее в окончательном определении - PullRequest
3 голосов
/ 28 февраля 2010

Это может быть глупо или очевидно, но я учусь создавать файлы стилей и модифицирую некоторый код из проекта beamerposter. Во всяком случае, у меня есть это:

\def\postercolumn#1
{\begin{column}{#1\textwidth}
      \begin{beamercolorbox}[center,wd=\textwidth]{postercolumn}
        \begin{minipage}[T]{.95\textwidth}
            %\parbox[t][\columnheight]{\textwidth}
}

\def\endpostercolumn
{
        \end{minipage}
      \end{beamercolorbox}
    \end{column}
}

Очевидно, что команда \ parbox закомментирована, но я хочу, чтобы она начиналась там и заканчивалась в конце блока. По сути, я хочу это:

\def\postercolumn#1
{\begin{column}{#1\textwidth}
      \begin{beamercolorbox}[center,wd=\textwidth]{postercolumn}
        \begin{minipage}[T]{.95\textwidth}
            \parbox[t][\columnheight]{\textwidth}{
}

\def\endpostercolumn
{
        }
        \end{minipage}
      \end{beamercolorbox}
    \end{column}
}

Но, естественно, это не работает, потому что компилятор запутался и думает, что раздел \ endpostercolumn закрывается. Есть ли какой-нибудь очевидный способ обойти это?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Вы можете попробовать \bgroup и \egroup вместо { и }. Не уверен, однако.

\bgroup - это \let до {, так что это неявное {. Таким образом, она не должна рассматриваться как дополнительная группирующая команда, пока не попадет в «желудок» TeX. То же самое о \egroup.


Редактировать: я пробовал с \parbox, похоже, он работает неправильно (потому что \parbox, похоже, слишком рано расширяет токены). С \vtop работает:

\documentclass{minimal}

\newlength\columnheight \columnheight=5cm % needed to define \columnheight,
                                          % don't have it here

\def\postercolumn{
    \leavevmode
    \vtop to \columnheight\bgroup
    \hsize.5\textwidth
    \noindent
    \ignorespaces
}

\def\endpostercolumn{
    \egroup
}


\begin{document}

\begin{postercolumn}
   hello world hello world hello world hello world
   hello world hello world hello world hello world
\end{postercolumn}

\end{document}

Кажется, это то, что вам нужно.


Редактировать: конечно, вам нужно было бы \hsize\textwidth вместо \hsize.5\textwidth

0 голосов
/ 01 марта 2010

Вместо использования \parbox вы можете использовать среду minipage:

\begin{minipage}[t]{\textwidth}
  % ...
\end{minipage}

% If you want to explicitly define the height:
\begin{minipage}[t][\columnheight]{\textwidth}
  % ...
\end{minipage}

Среда minipage имеет те же параметры, что и команда \parbox:

\begin{minipage}[pos][height][inner-pos]{width}
  % ... text ...
\end{minipage}

, где pos - это один из c, t или b (для центра, верха и низа соответственно); height - желаемая высота блока, inner-pos - один из c, t, b или s (для центра, верха, низа и растяжения соответственно); и width - желаемая ширина коробки.

Если вы выберете s для значения inner-pos, текст будет растянут, чтобы заполнить вертикальное пространство в блоке (дополнительное пространство будет добавлено между абзацами). Если вы решите не указывать inner-pos, будет установлено то же значение, что и pos.

Я не проверял это с вашим кодом, но он должен работать. (Я использовал его при определении новых сред.)

...