Как контролировать начальную позицию текста в среде multicols?

Как контролировать начальную позицию текста в среде multicols?

Начальная позиция текста сильно варьируется в среде multicols в зависимости от размера шрифта. Если выбрать большой размер шрифта, текст касается верха; но если выбрать маленький размер шрифта, текст располагается очень низко. Это выглядит очень перекошенным. Как это исправить?

\documentclass[12pt]{article}
\usepackage{multicol}

\setlength{\columnseprule}{0.4pt}

\newcommand{\m}{\begin{multicols}{2}
  \noindent
  this is a test\\
  this is a test\\
  this is a test\\
  this is a test
\end{multicols}}

\begin{document}
  \Huge\m
  \normalsize\m
  \tiny\m
\end{document}

Уродливые многоколонки

решение1

Вариант использования, для которого multicolбыл написан, заключается в имитации создания страницы, как это обычно происходит, за исключением того, что вместо одного столбца создается несколько столбцов. Это означает, что в верхней части каждого столбца \topskipиспользуется для размещения первой строки среды multicols.

\topskip— это регистр, который обычно не изменяется по всему документу (даже если размер шрифта меняется в некоторых местах документа). Это делается для того, чтобы первая строка на странице «обычно» находилась в одной и той же позиции. Значение для \topskipобычно определяется классом, т. е. если вы указываете 12ptв качестве параметра для класса, то размер шрифта по умолчанию будет 12 пунктов, и \topskipтакже будет 12 пунктов (в то время как \baselineskipбудет иметь вид 14.4pt).

В вашем варианте использования это может выглядеть немного странно, но, как я уже сказал, пакет не был написан для этого варианта использования, так как все тело среды будет иметь другой размер шрифта, и если, скажем, у вас есть мелкий шрифт в первой строке первого столбца, но обычный шрифт во втором столбце, то такой multicolподход позволит сделать так, чтобы он выглядел правильно, тогда как при \topskipизменении размера шрифта это будет выглядеть довольно неровно.

Кроме того, разрыв страницы — асинхронная операция, поэтому \topskipизменение размера шрифта в тексте может произойти в неправильном месте, поскольку TeX решит разорвать страницу раньше или позже.

Таким образом, один из способов удовлетворить ваш вариант использования — это изменить \topskipвремя multicolsактивности. Это можно сделать внутри среды, чтобы старое значение topskip было восстановлено после изменения среды, например:

\documentclass[12pt]{article}
\usepackage{multicol}

\setlength{\columnseprule}{0.4pt}

\newcommand{\m}[1]{\begin{multicols}{2}
  #1\setlength\topskip{.7\baselineskip}%              set font and \topskip
  \noindent
  this is a test\\
  this is a test\\
  this is a test\\
  this is a test
\end{multicols}}

\begin{document}
  \m{\Huge}
  \m{\normalsize}
  \m{\tiny}
\end{document}

Теперь шрифт и значение topskip изменяются только в теле env, и вы получите следующий вывод:

введите описание изображения здесь

Вместо того, чтобы сделать его 70% от \baselineskipединицы, конечно, можно было бы указать какое-то явное значение или другую дробь. Менее 60% или около того ничего не даст, потому что персонажи уже займут это количество.

решение2

Я не уверен, откуда взялся \topskip, но по умолчанию он равен 12pt независимо от размера шрифта. Значения меньше .6\baselineskip, похоже, не оказывают никакого эффекта. Большие значения перемещают верхнюю часть выше.

\documentclass[12pt]{article}
\usepackage{multicol}

\setlength{\columnseprule}{.4pt}%

\newcommand{\m}{\topskip=.6\baselineskip
\begin{multicols}{2}
  \noindent
  this is a test\\
  this is a test\\
  this is a test\\
  this is a test
\end{multicols}}

\begin{document}

\noindent
  \Huge\m
  \normalsize\m
  \tiny\m
\end{document}

топскип

Связанный контент