在每个字符后插入`\hfill`

在每个字符后插入`\hfill`

我正在创建如下的标题页:

\begin{titlepage}
  \vspace*{1in}
  \begin{center}
    \parbox{0.8\textwidth}[s]{\HUGE%
      T\hfill H\hfill I\hfill S\hfill 
      \hfill\hfill\hfill\hfill %space = 4xhfill
      I\hfill S %no hfill after the last character of the line.
    }\\
    \parbox{0.8\textwidth}[s]{\HUGE%
      M\hfill Y\hfill
      \hfill\hfill\hfill\hfill
      T\hfill I\hfill T\hfill L\hfill E
    }\\
  \end{center}
  \vspace*{\fill}
  \vspace*{1in}
\end{titlepage}

\HUGE定义如下:\def\HUGE{\fontsize{60}{60}\selectfont}

我想X\hfill用自动宏替换 many ,该宏会\hfill自动在每个字符后插入,并将任何空格替换为四个\hfillIE一个允许我写入的宏:

...
\begin{center}
  \titleline{0.8\titlewidth}{THIS IS}\\
  \titleline{0.8\titlewidth}{MY TITLE}\\
\end{center}
...

我正在使用 (Xe)LaTeX,并希望在可以在两个系统上运行的包中制作该宏,例如articlebook。我没有使用其他文档类的经验。

谢谢。

答案1

我并不特别关心输出,但下面的内容或多或少完全符合您的要求。

\documentclass{article}
\usepackage{lipsum}

% The user-facing command
\newcommand\titleline[2][0.8\linewidth]{%
    {\Huge\parbox{#1}{\addhfills{#2}}\\}%
}

\makeatletter
\def\addhfills#1{%
    % rescan the argument with catcode 12 for spaces (so that they aren't ignored).
    \begingroup\catcode` =12\relax\xdef\tmp{\scantokens{#1\noexpand}}\endgroup%
    \expandafter\addhfills@@\tmp\addhfills@end%
}
% save catcode 12 space
\begingroup\catcode` =12\relax\gdef\otherspace{ }\endgroup
% an end marker
\def\addhfills@end{\relax}

\def\addhfills@@#1{#1\addhfills@@@}
\def\addhfills@@@#1{%
    \ifx#1\addhfills@end\else%
        \def\tmp{#1}%
        \ifx\tmp\otherspace%
            \hfill\hfill%
        \else%
            \hfill#1%
        \fi%
        \expandafter\addhfills@@@%
    \fi%
}

\begin{document}
\begin{center}
  \titleline{THIS IS}
  \titleline{MY TITLE}
\end{center}

\lipsum[1]
\end{document}

结果

答案2

这是一个microtype基于的解决方案。我用过\Huge,但原理是一样的:

\documentclass{article}
\usepackage{microtype}
\begin{document}
\centering
\parbox{.8\textwidth}{\Huge
\parfillskip=0pt
\hrule
\medskip
\textls[200]{THIS IS MY TITLE}

\medskip
\hrule}
\end{document}

其中一个关键是设置\parfillskip为零,这样 TeX 就不会添加任何空间来填充段落的最后一行。你可以调整可选参数,直到\textls结果令人满意;我相信自动化解决方案可以替代您的眼睛。

例子

答案3

这是一个使用常规的选项\makebox。可选的对齐规范s会将其内容展开以适合给定的框宽度。这是一个最小示例:

在此处输入图片描述

\documentclass{article}
\begin{document}
\centering
\rule{.5\linewidth}{1pt} \par
\makebox[.5\linewidth][c]{THIS IS MY TITLE} \par
\makebox[.5\linewidth][s]{T H I S {} I S {} M Y {} T I T L E} \par
\makebox[.5\linewidth][s]{T H I S {} {} I S {} {} M Y {} {} T I T L E} \par
\rule{.5\linewidth}{1pt}
\end{document}

添加{}会增加单词间空格所允许的空间。

答案4

xstring以下是使用和 的解决方案etoolbox

\documentclass{article}
\usepackage{lmodern}
\usepackage{xstring}
\usepackage{etoolbox}
\def\HUGE{\fontsize{60}{60}\selectfont}
\newcommand\bigtitle[2][\linewidth]{%
  {\def\result{\HUGE}%
  \StrSplit{#2}{1}{\firstchar}{\rest}%
  \eappto\result{\firstchar}%
  \IfStrEq{\rest}{}{}{\restbigtitle{\rest}}%
  \noindent\HUGE\centering
  \makebox[#1]{\result}\par}

}
\newcommand\restbigtitle[1]{%
  \StrSplit{#1}{1}{\firstchar}{\rest}%
  \IfStrEq{\firstchar}{ }{%
    \eappto\result{\hfill\hfill\hfill}%
  }{%
    \eappto\result{\hfill\firstchar}%
  }%
  \IfStrEq{\rest}{}{}{\restbigtitle{\rest}}%
}
\begin{document}
\begin{titlepage}
  \null
  \vfill
  \bigtitle{THIS IS}
  \bigtitle{MY TITLE}
  \vfill
  \bigtitle[.8\linewidth]{THIS IS}
  \bigtitle[.8\linewidth]{MY TITLE}
  \vfill
  \bigtitle{THIS IS MY}
  \bigtitle{TITLE}
  \vfill
  \null
\end{titlepage}
\end{document}

在此处输入图片描述

编辑:我使用makebox而不是minipage来允许在overfull \hbox文本太大时发出警告。

相关内容