Latex 能否使用 ttf 字体用居中文本填充特定纵横比(例如 3:1)的区域,以便可以将其导出到特定像素大小的图像(600x200,可能使用转变)?
单词或字母间距不应改变(如\Shapepar
下面的尝试所示)。
Imagemagickconvert
可以做到这一点:
convert -size 600x200 -font Montserrat-Regular -gravity center \
caption:"I am curious about area-filling text rendering options" test.png
\Shapepar
修改字间距,影响可读性:
\documentclass[preview]{standalone}
\usepackage{fontspec}
\setmainfont{Montserrat-Regular}
\usepackage{shapepar}
\begin{document}
\Shapepar{\rectangleshape{200}{600}}I am curious about area-filling text rendering options\par
\end{document}
我也尝试增加点大小并限制页面大小,\geometry
但这会导致错误
可以\Shapepar
将文本居中而不是修改字间距吗?或者是否有其他方法可以在 Latex 中用文本填充特定矩形?
答案1
值得庆幸的是,非常相似的问题已经得到解决。以下是改编版:
\documentclass[preview]{standalone}
\usepackage{fontspec}
\setmainfont{Montserrat-Regular}
\sloppypar
\usepackage{environ}% http://ctan.org/pkg/environ
\newdimen\fontdim
\newdimen\upperfontdim
\newdimen\lowerfontdim
\newif\ifmoreiterations
\fontdim12pt
\newbox\trialbox
\newbox\linebox
\global\newcount\maxbad
\newcount\linebad
\newcount\currenthbadness
\makeatletter
\NewEnviron{fitbox}[2]{% \begin{fitbox}{<width>}{<height>} stuff \end{fitbox}
% Store environment body
\def\stuff{%
\BODY%
}%
% prepare badness box
\def\badnessbox{%
\global\maxbad=0\relax%
\currenthbadness=\hbadness% save old \hbadness
\hbadness=10000000\relax% make sure, TeX reports overfull boxes
\message{Starting measureline recursion with width #1^^J}%
\setbox\trialbox=\vbox{%
\hsize#1\relax%
\fontsize{\fontdim}{1.2\fontdim}%
\selectfont%
\stuff\par%
\measurelines% start recursion
}%
% \noindent\usebox\trialbox\par
\hbadness=\currenthbadness% restore old \hbadness
}
% prepare recursion to measure line badness
\def\measurelines{%
\message{Iteration of measurelines^^J}%
\begingroup%
\setbox\linebox=\lastbox% get the last line
\setbox0=\hbox to \hsize{\unhcopy\linebox}% put the last line into box0 to provoke badness calculation
\linebad=\the\badness\relax% \badness now reflects the last typeset box, i.e. box0
\message{Badness: \the\badness\space\the\linebad\space with max \the\maxbad\space at Fontsize: \the\fontdim\space^^J}%
\ifnum\linebad>\maxbad% store the maximum badness
\global\maxbad=\linebad% Uncomment this line to ignore overfull hboxes!
\fi%
\ifvoid% end of recursion
\linebox%
\else%
\unskip\unpenalty\measurelines% do the recursion
\ifhmode%
\newline%
\fi%
\noindent\box\linebox% do the output
\fi%
\endgroup%
}%
% Prepare measurement box
\def\buildbox{%
\badnessbox% measure badness
\setbox0\vbox{% measure height
\hbox{%
\fontsize{\fontdim}{1.2\fontdim}%
\selectfont%
\minipage{#1}%
\vbox{%
\stuff\par%
}%
\endminipage%
}%
}%
\message{Measured badness: \the\maxbad\space at Fontsize: \the\fontdim\space^^J}%
\dimen@\ht0
\advance\dimen@\dp0
\message{Measured box height: \the\dimen@\space^^J}%
}%
\def\shrinkheight{%
\loop
\fontdim.5\fontdim % Reduce font size by half
\buildbox
\message{Shrinking, new box height: \the\dimen@\space at Fontsize: \the\fontdim\space^^J}%
\ifdim\dimen@>#2 \repeat
\lowerfontdim\fontdim
\upperfontdim2\fontdim
\fontdim1.5\fontdim
}%
\def\shrinkwidth{%
\loop
\fontdim.5\fontdim % Reduce font size by half
\buildbox
\ifnum\maxbad>10000 \repeat
\lowerfontdim\fontdim
\upperfontdim2\fontdim
\fontdim1.5\fontdim
}%
\def\growheight{%
\loop
\fontdim2\fontdim % Double font size
\buildbox
\message{Growing, new box height: \the\dimen@\space at Fontsize: \the\fontdim\space^^J}%
\ifdim\dimen@<#2 \repeat
\upperfontdim\fontdim
\lowerfontdim.5\fontdim
\fontdim.75\fontdim
}%
\buildbox
% Compute upper and lower bounds
\ifdim\dimen@>#2
\message{Need to shrink box height: \the\dimen@\space^^J}%
\shrinkheight
\else
\message{Need to grow box height: \the\dimen@\space to target: #2^^J}%
\growheight
\fi
\message{Max font: \the\upperfontdim\space^^J}%
\message{Min font: \the\lowerfontdim\space^^J}%
% Potentially further reduce bounds for overfull box
\ifnum\maxbad>10000
\shrinkwidth
\fi
\message{Max font adjusted: \the\upperfontdim\space^^J}%
\message{Min font adjusted: \the\lowerfontdim\space^^J}%
% Now try to find the optimum height and width
\loop
\buildbox
\message{Height: \the\dimen@\space^^J}%
\ifdim\dimen@>#2
\moreiterationstrue
\upperfontdim\fontdim
\advance\fontdim\lowerfontdim
\fontdim.5\fontdim
\else
\ifnum\maxbad>10000
\moreiterationstrue
\upperfontdim\fontdim
\advance\fontdim\lowerfontdim
\fontdim.5\fontdim
\else
\advance\dimen@-#2
\ifdim\dimen@<10pt
\lowerfontdim\fontdim
\advance\fontdim\upperfontdim
\fontdim.5\fontdim
\dimen@\upperfontdim
\advance\dimen@-\lowerfontdim
\ifdim\dimen@<.2pt
\moreiterationsfalse
\else
\moreiterationstrue
\fi
\else
\moreiterationsfalse
\fi
\fi
\fi
\ifmoreiterations \repeat
\message{Selected font: \the\fontdim\space^^J}%
\vbox to #2{\box0\hbox{}}% Typeset content
}%
\makeatother
\usepackage{parskip}
\setlength\fboxsep{0pt}
\begin{document}
\begin{fitbox}{600px}{200px}%
\center{I am curious about area-filling text rendering options}
\end{fitbox}
\end{document}
这是用 处理的lualatex
。