我正在创建如下的标题页:
\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
自动在每个字符后插入,并将任何空格替换为四个\hfill
,IE一个允许我写入的宏:
...
\begin{center}
\titleline{0.8\titlewidth}{THIS IS}\\
\titleline{0.8\titlewidth}{MY TITLE}\\
\end{center}
...
我正在使用 (Xe)LaTeX,并希望在可以在两个系统上运行的包中制作该宏,例如article
和book
。我没有使用其他文档类的经验。
谢谢。
答案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
文本太大时发出警告。