Como posso controlar a posição inicial do texto em um ambiente multicols?

Como posso controlar a posição inicial do texto em um ambiente multicols?

A posição inicial do texto varia muito no ambiente multicols, dependendo do tamanho da fonte. Se você escolher um tamanho de fonte grande, o texto tocará o topo; mas se você escolher um tamanho de fonte pequeno, o texto ficará muito baixo. Isso parece muito desequilibrado. Como faço para corrigir isso?

\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}

Multicols feios

Responder1

O caso de uso para o qual multicolfoi escrito é imitar a criação de páginas como normalmente acontece, exceto que em vez de uma única coluna são produzidas várias colunas. Isso significa que no topo de cada coluna \topskipé utilizada para posicionar a primeira linha do multicolsambiente.

\topskipé um registro que normalmente não é alterado ao longo do documento (mesmo que o tamanho da fonte esteja mudando em alguns lugares do documento). Isso é feito para que a primeira linha de uma página fique "normalmente" na mesma posição. O valor de for \topskipnormalmente é definido pela classe, ou seja, se você especificar 12ptcomo uma opção para a classe o tamanho da fonte padrão será 12 pontos e o tamanho da fonte \topskiptambém será 12 pontos (enquanto o valor \baselineskipserá algo como 14.4pt).

No seu caso de uso isso pode parecer um pouco estranho, mas como eu disse, o pacote não foi escrito para este caso de uso, pois todo o corpo do ambiente estaria em um tamanho de fonte diferente e se digamos que você tem uma fonte pequena no primeira linha da primeira coluna, mas uma fonte normal na segunda coluna, então a multicolabordagem faria com que ela saísse correta, ao passo que, com \topskipa mudança do tamanho da fonte, isso pareceria bastante irregular.

Além disso, a quebra de página é uma operação assíncrona, portanto, a \topskipalteração por um comando de tamanho de fonte dentro do texto pode acontecer no lugar errado, pois o TeX decide quebrar mais cedo ou mais tarde.

Portanto, uma maneira de atender ao seu caso de uso é alterar \topskipo tempo multicolsativo, é possível fazer isso dentro do ambiente para que o valor antigo do topskip seja restaurado assim que o ambiente mudar, por exemplo

\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}

Agora, a fonte e o valor topskip são alterados apenas durante o corpo do env e você obterá a seguinte saída:

insira a descrição da imagem aqui

Em vez de torná-lo 70% de \baselineskipum, é claro que poderíamos fornecer algum valor explícito ou uma fração diferente. Menos de 60% ou mais não fazem nada porque os personagens já ocuparão essa quantia.

Responder2

Não tenho certeza de onde vem o \topskip, mas o padrão é 12pt, independentemente do tamanho da fonte. Valores menores que .6\baselineskip parecem não ter efeito. Valores maiores movem o topo para cima.

\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}

pular

informação relacionada