以下代码块取自这个答案。它展示了如何断开长行(见下面的代码和截图。)
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\parindent0pt
\makeatletter
\def\scanfunction#1{#1}
\let\tempa\@empty
\def\scan@letters#1#2{%
\g@addto@macro{\tempa}{#1\hskip 0pt plus 1sp minus 1sp}%
\ifx#2\@empty
\else
\expandafter\scan@letters
\fi
#2}
\def\scan#1{%
\scan@letters #1\@empty
}
\scan{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
\tempa
\lipsum[1]
\end{document}
我注意到,当showframe
从geometry
包中使用时,其中一个a
超出了范围限制(参见下面的代码和图像。)
\documentclass{article}
\usepackage[showframe]{geometry}
\begin{document}
\parindent0pt
\makeatletter
\def\scanfunction#1{#1}
\let\tempa\@empty
\def\scan@letters#1#2{%
\g@addto@macro{\tempa}{#1\hskip 0pt plus 1sp minus 1sp}%
\ifx#2\@empty
\else
\expandafter\scan@letters
\fi
#2}
\def\scan#1{%
\scan@letters #1\@empty
}
\scan{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
\tempa
\end{document}
1sp
我通过更改为3sp
(参见下面的代码和屏幕截图)解决了这个问题。
\documentclass{article}
\usepackage[showframe]{geometry}
\begin{document}
\parindent0pt
\makeatletter
\def\scanfunction#1{#1}
\let\tempa\@empty
\def\scan@letters#1#2{%
\g@addto@macro{\tempa}{#1\hskip 0pt plus 3sp minus 3sp}%
\ifx#2\@empty
\else
\expandafter\scan@letters
\fi
#2}
\def\scan#1{%
\scan@letters #1\@empty
}
\scan{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
\tempa
\end{document}
但是,当增加字体大小时,此方法不起作用(请参见下面的代码和屏幕截图)。以下文档是使用 编译的,用于xelatex
将字体大小设置为60pt
。
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{lipsum}
\begin{document}
\fontsize{60pt}{60pt}\selectfont
\parindent0pt
\makeatletter
\def\scanfunction#1{#1}
\let\tempa\@empty
\def\scan@letters#1#2{%
\g@addto@macro{\tempa}{#1\hskip 0pt plus 3sp minus 3sp}%
\ifx#2\@empty
\else
\expandafter\scan@letters
\fi
#2}
\def\scan#1{%
\scan@letters #1\@empty
}
\scan{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
\tempa
\end{document}
随着字体大小的增加,多余的空间也会增加(参见下面的代码和截图)。以下文档是使用xelatex
将字体大小设置为 进行编译的100pt
。
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{lipsum}
\begin{document}
\fontsize{100pt}{100pt}\selectfont
\parindent0pt
\makeatletter
\def\scanfunction#1{#1}
\let\tempa\@empty
\def\scan@letters#1#2{%
\g@addto@macro{\tempa}{#1\hskip 0pt plus 3sp minus 3sp}%
\ifx#2\@empty
\else
\expandafter\scan@letters
\fi
#2}
\def\scan#1{%
\scan@letters #1\@empty
}
\scan{CCCCCCCCCCCCCC}
\tempa
\end{document}
我的问题是:使用编译时,如何在不超过任何给定字体大小的页面限制的情况下中断长行xelatex
?
答案1
正如已经评论在聊天中,这只是您准备接受多少字母间距的选择。在极限情况下,如果您只有两个字母 1/3\textwidth
宽,并且您仍然想用替换的字符串对齐,那么1sp
从技术上讲这是您问题的答案,但这可能不是您想要的答案。.333\textwidth
.333\testwidth
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{lipsum}
\begin{document}
\fontsize{220pt}{240pt}\selectfont
\parindent0pt
\makeatletter
\def\scanfunction#1{#1}
\let\tempa\@empty
\def\scan@letters#1#2{%
\g@addto@macro{\tempa}{#1\hskip 0pt plus .3\textwidth minus .3\textwidth}%
\ifx#2\@empty
\else
\expandafter\scan@letters
\fi
#2}
\def\scan#1{%
\scan@letters #1\@empty
}
\scan{MMMMMM}
\tempa
\end{document}
您可能更喜欢使用固定的 0pt 跳过来添加断点,然后\raggedright
在需要时使用较短的行,而不是通过任意大的字母间距来调整。