
Некоторые команды LaTeX принимают несколько необязательных аргументов. Вот несколько примеров:
\makebox[<width>][<pos>]{<text>}
\framebox[<width>][<pos>]{<text>}
\parbox[<pos>][<height>][<contentpos>]{<width>}{<text>}
\raisebox{<lift>}[<height>][<depth>]{<text>}
\begin{minipage}[<pos>][<height>][<contentpos>]{<width>} <content> \end{minipage}
(фактически среда)
(Но мой вопрос задан в совершенно общем смысле.)
Казалось бы, интуитивно понятно, что если указано только правильное подмножество необязательных аргументов, то они заполняются, начиная слева.<- Обратите внимание, что эта догадка оказалась неверной!)
Но задокументировано ли где-нибудь такое поведение? Знает ли кто-нибудь какие-либо контрпримеры?Нет априорной причины, по которой все команды будутиметьвести себя таким образом.
решение1
Нет общей конвенции для интерпретации отсутствующих необязательных аргументов. То, что вы приводите в качестве примеров, показывает это: нет «заполнения слева», что не имело бы особого смысла.
В некоторых случаях команда ведет себя иначе, чем те, которые вы цитируете. Например, команды цитирования в biblatex
имеют вид
\command[prenote][postnote]{keys}
и отсутствие второго необязательного аргумента заставляет первый интерпретироваться как postnote
. Это выбор, сделанный программистом.
Это не «контрпример», поскольку общего правила сформулировать невозможно.
Четыре команды и среда, которые вы упомянули, описаны в руководстве по LaTeX, но расширенный синтаксис, то есть второй и третий необязательные аргументы \parbox
и minipage
, описан только в LaTeX Companion.
\makebox[wdth][pos]{text}
находится на странице 217 руководства LaTeX. Второй необязательный аргумент имеет смысл только в том случае, если указан первый; по умолчанию он равенc
и может быть такжеl
,r
илиs
. Они означают «центр», «лево», «право» и «распространение»; первые три почти очевидны, поскольку они означают, как материал размещается относительно указанной ширины; последний означает, что пробелы в материале будут растянуты для заполнения указанной ширины.\framebox
имеет точно такой же синтаксис, как\makebox
\raisebox{raise_len}[width][depth]{text}
находится на странице 219 руководства LaTeX. Второй необязательный аргумент для указания глубины результирующего блока может быть использован только в том случае, если указан первый.\parbox[pos][height][inner-pos]{width}{text}
можно найти на странице 866 LaTeX Companion (второе издание). В руководстве LaTeX упоминается только первый необязательный аргумент. Посколькуminipage
аргументы имеют точно такое же значение.
Что делают необязательные аргументы \parbox
и minipage
?
Третий необязательный аргумент может быть указан только в том случае, если ему предшествуют два других; второй — только в том случае, если ему предшествует первый.
Первый необязательный аргумент может быть c
(по умолчанию) t
или b
, говорящий, как результирующий блок будет вертикально выровнен относительно окружающего материала. Для t
выравнивания будет относительно базовой линии первого элемента в блоке, для b
последнего элемента будет использоваться; c
означает, что блок вертикально центрирован, наполовину выше базовой линии и наполовину ниже ее (почти).
Второй необязательный аргумент указывает вертикальное измерение для коробки. Вот пример; \rod
просто рисует измерительную линейку с маркером для базовой линии, прикрепляющимся слева; \fbox
используется для отображения расширения коробки.
\documentclass{article}
\newcommand{\rod}[2]{%
\leavevmode\smash\llap{\vrule height .2pt depth .2pt width 4pt \vrule height #1 depth #2}%
}
\setlength{\fboxsep}{0pt}
\begin{document}
\rod{2cm}{0pt}
\fbox{\parbox[b][2cm]{.3\textwidth}{
Some text\\
some other text\\
again
}}
\end{document}
Мы могли бы использовать c
для третьего необязательного аргумента
\parbox[b][2cm][c]{.3\textwidth}{...}
и мы бы получили
Обратите внимание, что расширение поля то же самое, только текст внутри перемещен в центр доступного пространства. Если третий аргумент не указан, он по умолчанию будет таким же, как первый.
Последний необязательный аргумент также может быть s
, но необходимо предоставить некоторое гибкое пространство. Например
\parbox[b][2cm][s]{.3\textwidth}{
Some text\\[\fill]
some other text\\[\fill]
again
}
будет производить
Обратите внимание, что ни в одном из вышеприведенных случаев глубина последнего элемента в коробке не принимается во внимание, если речь идет о вертикальном измерении. Во втором примере коробкаточно2 см в вертикальном направлении, так как последний элемент — это клей-заполнитель, который не имеет глубины.
Вот объединенный пример для внешнего выравнивания «сверху». Применимы те же соображения, что и раньше.
\documentclass{article}
\newcommand{\rod}[2]{%
\leavevmode\smash\llap{\vrule height .2pt depth .2pt width 4pt \vrule height #1 depth #2}%
}
\setlength{\fboxsep}{0pt}
\begin{document}
\rod{\ht\strutbox}{\dimexpr2cm-\ht\strutbox}
\fbox{\parbox[t][2cm]{.3\textwidth}{
\strut Some text\\
some other text\\
again
}}
\rod{0pt}{2cm}
\fbox{\parbox[t][2cm][b]{.3\textwidth}{
\strut Some text\\
some other text\\
again
}}
\rod{\ht\strutbox}{\dimexpr2cm-\ht\strutbox}
\fbox{\parbox[t][2cm][s]{.3\textwidth}{
\strut Some text\\
some other text\\[\fill]
again
}}
\end{document}