На последней странице двухколоночной части текста, которая использует multicol
, я хочу поместить одноколоночное уведомление внизу страницы, и я хотел бы, чтобы разделяющее столбцы правило простиралось до самого верха одноколоночной части. Использование vfill
outside multicols
помещает уведомление в нужное место, но правило простирается только до фактического многоколоночного текста. Использование vfill
inside multicols
не дает никакого эффекта.
Мне бы хотелось, чтобы он выдал что-то вроде следующего, но, очевидно, без ручного \vspace*
управления:
\documentclass{article}
\usepackage{multicol}
\usepackage{lipsum}
\setlength{\columnsep}{0.5in}
\setlength{\columnseprule}{0.5pt}
\begin{document}
\begin{multicols}{2}
\lipsum[1]
\columnbreak
\lipsum[2]
\vspace*{300pt}
\end{multicols}
\centering\Huge\textbf{\textsf{STOP}}
\end{document}
В некотором смысле это противоположная проблемаТа же страница и многоколонкивопрос в том, что мне нужно убедиться, что то, что идет после окружения, multicols
сохраняется на той же странице.
решение1
Вы можете вставить вертикальную линейку на последней странице, используяeso-pic
:
\documentclass{article}
\usepackage{multicol,eso-pic,lipsum,xcolor}
\setlength{\columnsep}{0.5in}
\setlength{\columnseprule}{0.5pt}
\begin{document}
\begin{multicols}{2}
\sloppy\lipsum[1-15]
\end{multicols}
\AddToShipoutPictureFG*{%
\AtTextLowerLeft{%
\makebox[0pt][l]{\makebox[\textwidth]{\Huge\bfseries\sffamily STOP}}% Set STOP
% Move to the right of the left text column
\hspace*{.5\dimexpr\textwidth-\columnseprule-2\columnsep}%
% Skip over column sep
\hspace*{\columnsep}%
% Insert vertical rule
\rule[3\baselineskip]{\columnseprule}{\dimexpr\textheight-3\baselineskip}%
}%
}
\end{document}
В приведенном выше примере \rule
на последней странице 3\baselineskip
снизу текстового блока накладывается символ a поверх всего, что находится на последней странице.
Вы могли бы добавить это в \AtEndDocument
. Однако не было проведено никаких испытаний, чтобы увидеть,ОСТАНАВЛИВАТЬСЯбудет ли он помещаться на странице или нет, и не будет ли он накладываться на существующий текст в столбцах.
В следующем примере задаетсяОСТАНАВЛИВАТЬСЯсодержимое внутри блока (называемого \stopbox
) и использует этот блок в качестве меры того, насколько далеко должна опускаться вертикальная линия на последней странице (+ один \baselineskip
):
\documentclass{article}
\usepackage{multicol,eso-pic,lipsum,xcolor}
\setlength{\columnsep}{0.5in}
\setlength{\columnseprule}{0.5pt}
\newsavebox{\stopbox}
\savebox{\stopbox}{%
\begin{tabular}[b]{c}
\Huge\bfseries\sffamily STOP \\
\small\itshape \ldots right here
\end{tabular}
}
\begin{document}
\begin{multicols}{2}
\sloppy\lipsum[1-15]
\end{multicols}
\AddToShipoutPictureFG*{%
\AtTextLowerLeft{%
\makebox[0pt][l]{\makebox[\textwidth]{\usebox{\stopbox}}}% Set STOP
% Move to the right of the left text column
\hspace*{.5\dimexpr\textwidth-\columnseprule-2\columnsep}%
% Skip over column sep
\hspace*{\columnsep}%
% Insert vertical rule
\rule[\dimexpr\ht\stopbox+\baselineskip]{\columnseprule}{\dimexpr\textheight-\ht\stopbox-\baselineskip}%
}%
}
\end{document}
решение2
Новый пакет multicolrule
(версия 1.1) может справиться с этой проблемой без необходимости в eso-pic
. Хотя решение Вернера было вполне пригодным для проблемы, изложенной в MWE, в производственных документах оно требовало сложного учета для решения таких ситуаций, как наличие материала в один столбец над средой multicols
, а исходные и перерисованные правила были немного не выровнены, что потребовало от меня стирания старой линии перед ее перерисовкой. С новым пакетом эти проблемы не возникают.
\documentclass{article}
\usepackage{multicolrule}
\usepackage{lipsum}
\setlength{\columnsep}{0.5in}
\newsavebox{\stopbox}
\savebox{\stopbox}{%
\begin{tabular}[b]{c}
\Huge\bfseries\sffamily STOP \\
\small\itshape \ldots right here
\end{tabular}
}
\SetMCRule{width=0.5pt,line-style=solid,extend-fill,extend-reserve=\ht\stopbox}
\begin{document}
\lipsum[1]
\begin{multicols}{2}
\lipsum[2-3]
\end{multicols}
\centering\usebox{\stopbox}
\end{document}
И вот результат: