字母从边距到边距均匀分布在一行上

字母从边距到边距均匀分布在一行上

我希望通过在 Microsoft Word 中按下此按钮即可轻松实现某些目标:

MS Word 中的分布式文本对齐

这样我就可以做出这样的事情:

示例标题

我目前所看到的在这个论坛上要么在页面上分布单词而不是字母,要么使用包sodef中的静态定义字母之间的间距soul来模拟这种效果,而不是真正地拉伸文本以到达两端。

我想知道 LaTeX 中是否有一个命令可以实现 Word 中该按钮的功能。

答案1

用 替换空格{}(这样就会出现双空格),并在每个字母后面放置一个空格。

警告带重音的字母不起作用。除非您使用 XeLaTeX 或 LuaLaTeX,否则需要做更多工作。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\widen}{mm}
 {
  \tl_set:Nx \l_tmpa_tl { #2 }
  \tl_replace_all:Nnn \l_tmpa_tl { ~ } { {} }
  \noindent
  \makebox[\textwidth][s]
   {
    \skip_set:Nn \spaceskip { 0pt plus 1fill }
    #1 \tl_map_inline:Nn \l_tmpa_tl { ##1 ~ } \unskip
   }
 }
\ExplSyntaxOff

\newcommand{\mytext}{SOMETHING BIG}

\begin{document}

\widen{\huge}{SOMETHING BIG}

\bigskip

\widen{\large}{\mytext}

\end{document}

在此处输入图片描述

最后说明: 有些东西用文字处理器来处理很容易,而用 TeX 来处理却很难,这通常清楚表明,从印刷工的角度来看,这是相当可疑的东西。

答案2

以下是使用 LaTeX\makebox进行s拉伸对齐的一个选项:

在此处输入图片描述

\documentclass{article}
\usepackage[paper=a6paper]{geometry}% Just for this example
\setlength{\parindent}{0pt}% Just for this example
\begin{document}

\sffamily
\makebox[\linewidth][s]{\LARGE\bfseries S O M E T H I N G {} B I G}

\makebox[\linewidth][s]{s o m e t h i n g {} s m a l l}


\bigskip

\newlength{\somethingbig}
\settowidth{\somethingbig}{\LARGE\bfseries SOMETHING BIG}

{\LARGE\bfseries SOMETHING BIG}

\makebox[\somethingbig][s]{s o m e t h i n g {} s m a l l}

\end{document}

答案3

以下是使用 directlua 的 lualatex 的完整解决方案:

\documentclass[]{article}

\usepackage{fontspec}
\setromanfont{Rockwell Extra Bold}

\newcommand\distributed[1]{%
  \makebox[\linewidth][s]{%
    \directlua{
      letters = {}
      for letter in string.gmatch("#1", ".") do
        if letter == " " then
          table.insert(letters, "{}")
        else
          table.insert(letters, letter)
        end
      end
      tex.sprint(table.concat(letters, " "))
    }%
  }%
}

\begin{document}
  \noindent{\Huge\bfseries\distributed{Hello World}}
  \distributed{Some more text}
\end{document}

结果如下: 结果

答案4

调整我的答案如何重复字符串中的所有字符?\hfill。我不得不修改它,以便不在第一个字符之前添加。

正如沃纳指出的那样,这种方法通常不能接受宏作为其论证的一部分。

\documentclass{article}
\usepackage{lipsum}
\newcommand\chariterate[1]{\chariteratehelpX#1 \relax\relax}
\def\chariteratehelpX#1#2\relax\relax{#1\chariteratehelpA#2\relax\relax}
\def\chariteratehelpA#1 #2\relax{%
  \chariteratehelpB#1\relax\relax%
  \ifx\relax#2\else\hfill\chariteratehelpA#2\relax\fi
}
\def\chariteratehelpB#1#2\relax{%
  \charop{#1}%
  \ifx\relax#2\else
    \chariteratehelpB#2\relax%
  \fi
}
\def\charop#1{\hfill#1}
\begin{document}
\sffamily
\noindent{\Huge\chariterate{SOMETHING BIG}}

\noindent{\scriptsize\chariterate{something small}}

\lipsum[1]
\end{document}

在此处输入图片描述

相关内容