关于lstlisting代码块文本框宽度的控制

发布于 2025-04-09 16:36:32

这是节标题的自定义

\titleformat{\section}[frame]
    {\color{藏花红}}
    {\centering\footnotesize\enspace 节 \thesection\enspace}
    {8pt}
    {\bfseries\filcenter\songti}
    [\vspace{-10pt}]

这是对lstlisting环境的控制

% 代码排版配置
% 自定义VBA语法高亮
\lstdefinelanguage{VBA}{
    morekeywords={Sub, End, Dim, As, Set, Range, Worksheet, MsgBox, If, Then, Else, For, Next, Do, While, Loop, Integer, String},
    sensitive=true,
    morecomment=[l]{'},       % 单行注释
    morestring=[b]{"},        % 字符串定义
    keywordstyle=\codefont\color[HTML]{0184bc},
    stringstyle=\codefont\color[HTML]{41a977},
    basicstyle=\codefont\small,
    keepspaces=true,
    numbers=left,
    % 边距控制
    xleftmargin=2em,                     % 左边界距
    xrightmargin=2em,                     % 右边界距
    framexleftmargin=1em,                % 框线左间距
    framexrightmargin=1em,               % 框线右间距
    framextopmargin=1em,                 % 上边距(边框到代码)
    framexbottommargin=1em,              % 下边距(边框到代码)
    columns=fullflexible            %非等宽
}
% 调整代码框的左右边距和宽度
\lstset{
    language=VBA,
    frame=single,
    linewidth=\dimexpr\textwidth + 2em, % 总宽度减去左右边框间距
    xleftmargin=2em,                         % 左内容边距
    xrightmargin=2em,                        % 右内容边距
    framexleftmargin=1em,                    % 左边框到内容的间距
    framexrightmargin=1em,                   % 右边框到内容的间距
    numbersep=-1.5em,                        % 行号位置调整
    escapeinside=``                          % 中文注释处理

效果非常糟糕!!!!如何改进呢?

image.png

最小工作示例

\documentclass[UTF8]{ctexbook}
\usepackage{zhlipsum}
\usepackage{geometry}
\usepackage{xcolor}
\usepackage{pagecolor} 
\usepackage{layout}
\usepackage{chemfig,subcaption,graphicx,float}
\usepackage{listings}
\usepackage{titletoc}
\usepackage{titlesec}
\usepackage{fontspec}
\definecolor{藏花红}{RGB}{236,45,122}
\titleformat{\section}[frame]
    {\color{藏花红}}
    {\centering\footnotesize\enspace 节 \thesection\enspace}
    {8pt}
    {\bfseries\filcenter\songti}
    [\vspace{-10pt}]

% 代码排版配置
% 自定义VBA语法高亮
\lstdefinelanguage{VBA}{
    morekeywords={Sub, End, Dim, As, Set, Range, Worksheet, MsgBox, If, Then, Else, For, Next, Do, While, Loop, Integer, String},
    sensitive=true,
    morecomment=[l]{'},       % 单行注释
    morestring=[b]{"},        % 字符串定义
    keywordstyle=\color[HTML]{0184bc},
    stringstyle=\color[HTML]{41a977},
    basicstyle=\small,
    keepspaces=true,
    numbers=left,
    % 边距控制
    xleftmargin=2em,                     % 左边界距
    xrightmargin=2em,                     % 右边界距
    framexleftmargin=1em,                % 框线左间距
    framexrightmargin=1em,               % 框线右间距
    framextopmargin=1em,                 % 上边距(边框到代码)
    framexbottommargin=1em,              % 下边距(边框到代码)
    columns=fullflexible            %非等宽
}
% 调整代码框的左右边距和宽度
\lstset{
    language=VBA,
    frame=single,
    linewidth=\dimexpr\textwidth + 2em, % 总宽度减去左右边框间距
    xleftmargin=2em,                         % 左内容边距
    xrightmargin=2em,                        % 右内容边距
    framexleftmargin=1em,                    % 左边框到内容的间距
    framexrightmargin=1em,                   % 右边框到内容的间距
    numbersep=-1.5em,                        % 行号位置调整
    escapeinside=``                          % 中文注释处理
}

\begin{document}
\section{初步}
\begin{lstlisting}[caption={生成斐波那契数列},label={code:fib}]
'斐波那契数列生成函数
Sub GenerateFibonacci()
\end{lstlisting}
\end{document}

查看更多

关注者
0
被浏览
154
4 个回答
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

可以试试这组参数

xleftmargin=.35em,%
xrightmargin=.35em,%

image.png

image.png

但这是要在geometry宏包不修改左右页面相对距离以及指定文档类的oneside选项的前提下的(如果修改了,这组参数也要做相应修改):

\documentclass[oneside]{ctexbook}
\usepackage{zhlipsum}
\usepackage[showframe]{geometry}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{titlesec}
\titleformat*{\section}{\makebox[\textwidth][c]} 
\titleformat{\section}[frame]
    {\color{magenta}}
    {\centering\footnotesize\enspace 节 \thesection\enspace}
    {8pt}
    {\bfseries\filcenter\songti}
    [\vspace{-10pt}]

\usepackage{listings}
\usepackage{xcolor}

\lstdefinelanguage{VBA}{
    morekeywords={Sub, End, Dim, As, Set, Range, Worksheet, MsgBox, If, Then, Else, For, Next, Do, While, Loop, Integer, String},
    sensitive=true,
    morecomment=[l]{'},
    morestring=[b]{"},
    keywordstyle=\color[HTML]{0184bc},
    stringstyle=\color[HTML]{41a977},
    basicstyle=\small\ttfamily,
    keepspaces=true,
    numbers=left,
    columns=fullflexible,
    xleftmargin=.35em,%
    xrightmargin=.35em,%
}

\lstset{
    language=VBA,
    frame=single,
    linewidth=\dimexpr\textwidth\relax,
    escapeinside=``
}

\begin{document}
\section{初步}
\begin{lstlisting}[caption={生成斐波那契数列},label={code:fib}]
'To generate the Fib Sequence
Sub GenerateFibonacci()
\end{lstlisting}
\end{document}
.
. 4天前
这家伙很懒,什么也没写!
\documentclass[UTF8,oneside]{ctexbook}
\usepackage{zhlipsum}
\usepackage{geometry}
\usepackage{xcolor}
\usepackage{pagecolor} 
\usepackage{layout}
\usepackage{chemfig,subcaption,graphicx,float}
\usepackage{listings}
\usepackage{titletoc}
\usepackage{titlesec}
\usepackage{fontspec}
\definecolor{藏花红}{RGB}{236,45,122}
% 强制框架宽度为 \textwidth
\titleformat*{\section}{\makebox[\textwidth][c]} 
\titleformat{\section}[frame]
    {\color{藏花红}}
    {\centering\footnotesize\enspace 节 \thesection\enspace}
    {8pt}
    {\bfseries\filcenter\songti}
    [\vspace{-10pt}]

% 代码排版配置
% 自定义VBA语法高亮
\usepackage{listings}
\usepackage{xcolor}

% 定义VBA高亮样式
\lstdefinelanguage{VBA}{
    morekeywords={Sub, End, Dim, As, Set, Range, Worksheet, MsgBox, If, Then, Else, For, Next, Do, While, Loop, Integer, String},
    sensitive=true,
    morecomment=[l]{'},       % 单行注释
    morestring=[b]{"},        % 字符串定义
    keywordstyle=\color[HTML]{0184bc},
    stringstyle=\color[HTML]{41a977},
    basicstyle=\small\ttfamily, % 等宽字体
    keepspaces=true,
    numbers=left,
    %framexleftmargin=1em,    % 左边框到代码内容的距离
   % framexrightmargin=1.5em,   % 右边框到代码内容的距离
  % xleftmargin=2em,           % 代码内容左缩进(边框内侧)
   %xrightmargin=2em,          % 代码内容右缩进(边框内侧)
    columns=fullflexible       % 非等宽对齐
}

% 全局设置:代码框总宽度 = \textwidth
\lstset{
    language=VBA,
    frame=single,
    linewidth=\dimexpr\textwidth \relax, % 内容宽度 = 总宽度 - (左+右)边框间距
    escapeinside=``                          % 中文注释处理
}



\begin{document}
\section{初步}
\begin{lstlisting}[caption={生成斐波那契数列},label={code:fib}]
'斐波那契数列生成函数
Sub GenerateFibonacci()
\end{lstlisting}
\end{document}


linewidth指文本宽度,默认值\linewidth
那么\linewidth 是什么呢
在LaTeX中,\linewidth 是一个动态的长度参数,表示​​当前环境下的可用行宽度​​。它的值会根据所在的环境自动调整,使得内容能够自适应不同的布局。以下是关键点总结:
​​动态特性​​:
\linewidth 的值在进入不同环境(如minipage、itemize、multicol等)时会自动更新,退出环境后恢复原值。
例如,在 minipage{0.5\textwidth} 内部,\linewidth 会变为 0.5\textwidth,方便内容自动适应容器宽度。

对比其他宽度参数​​:
​​\textwidth​​:整个页面的文本区域宽度(固定值,由文档类和页边距决定)。
​​\columnwidth​​:在多栏布局中单栏的宽度(与\linewidth在单栏中通常相等)。
​​\hsize​​:底层TeX参数,一般不建议直接修改。

​​常见使用场景​​:
​​图片插入​​:\includegraphics[width=\linewidth]{...} 让图片宽度适配当前环境。
​​表格或浮动体​​:设置表格或浮动体宽度为当前行宽,增强布局灵活性。
​​嵌套环境​​:在列表、缩进或自定义盒子中,\linewidth 自动减去缩进或边距。

framexleftmargin=1.5em,    左边框到代码内容的距离,只调整这个,行号位置是不变的区别于下面

左右额外边距(Extra Margins)​​
​​参数​​:
xleftmargin:代码内容左侧的额外边距(从页面左边缘到代码内容的距离)。
xrightmargin:代码内容右侧的额外边距(从代码内容到页面右边缘的距离)。
​​作用​​:
这两个参数会在代码内容的 ​​左右两侧添加额外的空白区域​​,类似于在代码块周围“填充”空白。
此边距会影响 ​​整个代码块​​(包括边框和行号)。
如果设置了 frame=single(边框),边框会包裹代码内容和这些额外边距。
.
. 4天前
这家伙很懒,什么也没写!

image.png
查字体族名,乱码
image.png
用系统的cmdimage.png
成功查询族名Source Han Serif CN,然后编译成功无报错

.
. 4天前
这家伙很懒,什么也没写!

我大胆猜想,这个框根据奇偶页数自动调整左右页边距了!我们需要让他水平居中

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览