如何自动挤压标题?

如何自动挤压标题?

在收到一些评论后,我将修改这个问题,以便它更容易理解。

这是我的 MWE:

\documentclass[12pt, twocolumn, a4paper]{article}

\begin{document}
\section*{This is a very long title, that goes over several lines and I would like to have the characters squeezed, so that it fits in one single line}
\end{document}

本节标题将跨越几行,因为我使用双栏文档中有两列,因此少于一半部分标题的 A4 纸宽度。当然,这个例子是极端我没有这样的我的文档中有很长的标题。我的标题确实只超出行一个字左右。

现在,我正在寻找代码,自动地测量章节标题的长度,然后调整它(挤压它!),以便整个标题最终适合一行。

有人知道怎么做吗?人物应被挤压,如压缩字体不是空格在文本中减少。

我希望有人有解决方案,感谢大家的努力!另外,我希望问题现在已经清楚了。

答案1

以下是一些似乎可以满足的条件:

  1. 您仅使用\section*

  2. 通常,章节标题比列宽短,但偶尔会滚动到两行。

  3. 翻滚应该总是适合一行。

(1)有助于简化测量(标题中没有截面编号)。我们可以使用xparse如果您不想更改代码,请重新定义\section并管理聚会。*

对于(3)我们可以使用graphicx调整\resizebox{<width>}{<height>}{<stuff>}内容大小以适应\linewidth

在此处输入图片描述

\documentclass[twocolumn]{article}

\usepackage{xparse,graphicx}

\let\oldsection\section
\makeatletter
\RenewDocumentCommand{\section}{s o m}{%
  \sbox\z@{\normalfont\Large\bfseries #3}%
  \ifdim\wd\z@>\linewidth
    \oldsection*{\resizebox{\linewidth}{\ht\z@}{\usebox\z@}}
  \else
    \oldsection*{#3}
  \fi
}
\makeatother

\begin{document}

\section*{A short title}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\section*{This is a very long title, that goes over several lines and I would like to have the characters squeezed, so that it fits in one single line}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\section*{This is a very long title spanning two lines}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\section*{XyzXXXXXXXXXXXXXXXX}
\section*{XyzXXXXXXXXXXXXXXXXXX}
\section*{XyzXXXXXXXXXXXXXXXXXXXX}
\section*{XyzXXXXXXXXXXXXXXXXXXXXX}
\section*{XyzXXXXXXXXXXXXXXXXXXXXXXX}
\section*{XyzXXXXXXXXXXXXXXXXXXXXXXXXX}

\end{document}

我们将\section标题存储在一个框中,并将该框的第wi个与 进行比较。如果它更宽,我们将其水平缩小到,否则我们就按原样设置标题。d\linewidth\linewidth

答案2

我找到了以下解决方案:

\usepackage[tracking=true]{microtype}               
\newcommand\squeeze[1]{\SetTracking{encoding=*}{#1}\lsstyle}

我可以这样调用它:

\section*{\squeeze{-75} *This is a very long title that is now being squeezed into one line*}

尽管如此,我必须说“挤”!并且每次都说挤多少(“-75”)。

有人知道一种方法吗,即文本自动地挤进线?

谢谢大家!

奥洛夫

答案3

第一个评论是,缩小标题超出 LaTeX 的默认设置可能会难以阅读或看起来不合适,因此重命名该部分可能是更好的选择。

话虽如此,如果一行内容放不下, 最好有一个打印\sectionshort[Short Title]{Full Title}命令。我们甚至可以选择压缩完整标题,而不是诉诸短标题。<Short Title><Full Title>https://tex.stackexchange.com/a/19414很好地解释了如何管理单词之间的间距,为了实现挤压,我刚刚减少了单词之间的正常间距——可能有其他更好的方法来做到这一点。

\newlength{\reducedsectionspacing}
\setlength{\reducedsectionspacing}{0.333pt} %This changes the natural spacing between words
\newlength{\defaultsectionspacing}
\setlength{\defaultsectionspacing}{\fontdimen2\font}
\newlength{\sectiontitlelength}

\newcommand{\shortsection}[2][]{
\section{\setlength{\sectiontitlelength}{\widthof{\thesection\quad}+\widthof{#2}}\ifdim\sectiontitlelength<\linewidth#2
\else
\fontdimen2\font=\reducedsectionspacing
\setlength{\sectiontitlelength}{\widthof{\thesection\quad}+\widthof{#2}}\ifdim\sectiontitlelength<\linewidth#2
\else\fontdimen2\font=\defaultsectionspacing
\ifx\\#1\\#2\else#1
\fi\fi\fi
}}

首先,我们测试给定的标题是否比行中可用的空间长,然后我们将 LaTeX 的默认字间距减少到\reducedsectionspacing,看看是否足以将其放在一行中。如果这还不够好,那么我们会放置短标题(如果有),否则放置完整标题。

使用以下内容进行测试

\shortsection[This title is short]{This title is far far far far too long to be practical}
\shortsection[This title is short]{This title is far far far too long to be practical thus it gets ignored and replaced by the short version}
\shortsection[This title is short]{This isn't too long}
\setcounter{section}{0}
\shortsection{This title is far far far far too long to be practical}
\shortsection{This title is far far far too long to be practical thus it gets ignored and replaced by the short version}
\shortsection{This isn't too long}

我们发现,在可行的情况下,标题被压缩在一起,并用短标题代替。

在此处输入图片描述

相关内容