对于代码列表,我经常更改参数listings
来basicstyle
调整字体大小,以便列表适合其所在的容器。
我主要使用表格中的单元格来显示小列表。但容器可以是minipage
整个页面,或其他任何东西。
因此,在表格单元格中,我使用\linewidth
,或者可能是的某个百分比textwidth
。
我还知道列表中最宽(最长)行的字符数。我编写了一个小型 lua 函数来查找此值。
我只是不知道如何使用以上两条信息,以便将其映射到正确的字体大小以告知listing
使用以使其适合。
现在假设11pt
使用该类。但如果这适用于任意值以及碰巧使用的任何字体系列,那就太好了。
这是显示示例列表的 MWE,我想将其显示在表格中。我知道所需的空间是\linewidth
,并且我计算出此示例的最长行是56
字符,并且我知道我使用的是 11 pt。
那么字体大小应该是多少才能适合列表?例如,当使用时\small
它不适合
上述代码为 (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
发现可行:
而这种手动调整正是我试图避免的。我认为,只要知道可用空间pt
、字符数以及文档使用的字体大小,就应该可以计算出需要传递给命令的字体大小,listing
这样就可以实现自动化了?
我也不确定是否可以指定任意字体大小值,或者是否仅限于给出的值\normalsize,\small
等......?
这可以自动化吗?
供参考,谢谢回答什么点 pt 字体大小大等
答案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}