如何自动调整列表的字体大小,以适应给定的文本宽度?

如何自动调整列表的字体大小,以适应给定的文本宽度?

对于代码列表,我经常更改参数listingsbasicstyle调整字体大小,以便列表适合其所在的容器。

我主要使用表格中的单元格来显示小列表。但容器可以是minipage整个页面,或其他任何东西。

因此,在表格单元格中,我使用\linewidth,或者可能是的某个百分比textwidth

我还知道列表中最宽(最长)行的字符数。我编写了一个小型 lua 函数来查找此值。

我只是不知道如何使用以上两条信息,以便将其映射到正确的字体大小以告知listing使用以使其适合。

现在假设11pt使用该类。但如果这适用于任意值以及碰巧使用的任何字体系列,那就太好了。

这是显示示例列表的 MWE,我想将其显示在表格中。我知道所需的空间是\linewidth,并且我计算出此示例的最长行是56字符,并且我知道我使用的是 11 pt。

那么字体大小应该是多少才能适合列表?例如,当使用时\small它不适合

Mathematica 图形

上述代码为 (MWE)

\documentclass[11pt]{scrbook}
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}

\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{listings}
\definecolor{bg}{RGB}{240,240,240}
\usepackage{moreverb}
\usepackage{luacode}
\begin{luacode*}
function getMaxLineWidth()
local maxLineLength = 0;

   local r    
   for line in io.lines("code.m") do
       r = string.len(line)
       print(line,r)
       if r>maxLineLength then
          maxLineLength=r
       end
   end     
   tex.print(maxLineLength)
end
\end{luacode*}
\newcommand{\getMaxLineWidth}{\directlua{ getMaxLineWidth() }}

\begin{document}

\begin{verbatimwrite}{code.m} 
clear all; 
syms s t
f = (s^4+5*s^3+6*s^2+9*s+30)/(s^4+6*s^3+21*s^2+46*s+30);
pretty(f)
\end{verbatimwrite}

\begin{tabular}{|p{0.7\textwidth}|}\hline    
space available for the listing is     \the\linewidth and the 
The maximum line width is \getMaxLineWidth \ then
what should be the font size below so it will fit?

\lstinputlisting[language=Matlab,backgroundcolor=\color{bg},
    basicstyle=\ttfamily\small]{code.m}
\\\hline
\end{tabular}

\end{document}

通过反复试验scriptsize发现可行:

Mathematica 图形

而这种手动调整正是我试图避免的。我认为,只要知道可用空间pt、字符数以及文档使用的字体大小,就应该可以计算出需要传递给命令的字体大小,listing这样就可以实现自动化了?

我也不确定是否可以指定任意字体大小值,或者是否仅限于给出的值\normalsize,\small等......?

这可以自动化吗?

供参考,谢谢回答什么点 pt 字体大小大等

Mathematica 图形

答案1

这个想法来自于大卫·卡莱尔在聊天中。基本上,您将列表放在一个框中,如果宽度超过某个宽度,该框就会缩小。该adjustbox包提供了一个简单的界面来执行此操作。

但请注意,Ulrike Fischer 在聊天中提到,这最终可能会看起来很糟糕(例如下面我的例子),但如果外观无关紧要,那么无论如何。

\documentclass{article}
\usepackage{matlab-prettifier}
\lstset{style=Matlab-editor,breaklines=false}
\usepackage{adjustbox}

\begin{document}
\begin{adjustbox}{max width=\textwidth}
\begin{lstlisting}
x = a + b + c + d + e + f + g + h + i + j + k + l + m +n + o + p + q + r + s + t + u + v + x + y
\end{lstlisting}
\end{adjustbox}

\begin{adjustbox}{max width=\textwidth}
\begin{lstlisting}
x = a + b + c + d + e + f
\end{lstlisting}
\end{adjustbox}
\end{document}

相关内容