断开长行而不超出任何给定字体大小的页面限制(xelatex)

断开长行而不超出任何给定字体大小的页面限制(xelatex)

以下代码块取自这个答案。它展示了如何断开长行(见下面的代码和截图。)

\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}

在此处输入图片描述

我注意到,当showframegeometry包中使用时,其中一个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在需要时使用较短的行,而不是通过任意大的字母间距来调整。

相关内容