测量逐字输入块的宽度

测量逐字输入块的宽度

有没有什么方法可以测量 VerbatimInput 块的宽度?

换句话说,我想要类似以下的内容,只是逐字数据应该从外部文件中获取,就像 \VerbatimInput 一样:

\documentclass{article}
\usepackage{fancyvrb}

\begin{document}

% Get the verbatim data from an external file instead.
\SaveVerb{data}+verbatim text }&^+

\newlength{\mylength}
\settowidth{\mylength}{\UseVerb{data}}

Width is: \the\mylength.

\end{document}

(保存逐字块对我来说并不重要,所以如果有完全不同的方法来测量它的宽度,那也是可以的。如果有另一个逐字包可以做到这一点,我也不会坚持使用 \fancyvrb 包。)

答案1

您的代码确实有效,并且也适用于列表。最好包含一个框架来查看发生了什么。

\documentclass{article}
\usepackage{listings,filecontents}
\begin{filecontents*}{verbatim.tex}
This is some verbatim .
\end{filecontents*}
\begin{document}
\newlength{\mylength}
\settowidth{\mylength}{\lstinputlisting{verbatim.tex}}
Width is: \the\mylength.\par
\fbox{\lstinputlisting{verbatim.tex}}
\end{document}

当您更改文件的内容(我用 filecontents 保存)时,您将看到长度发生变化。

答案2

您可以使用\savebox{\mybox}{<content>}(需要\newsavebox\mybox先) 将任何内容存储在水平框中,然后使用 访问其宽度\wd\mybox。实际上\settowidth就是这样做的。

\VerbatimInputfrom 的问题在于fancyvrb,它将逐字文本作为段落插入,这将在由保存框强制限制的水平模式下造成麻烦无论如何都会强制内容的宽度\linewidth!因此,您需要找到其他命令来输入逐字文本而不形成完整的段落。我不确定 verbatim 包是否允许您从外部文件插入单行逐字内容而不形成段落。但是,您可以使用我刚刚编写的以下命令,它使用通常的逐字相关设置来完成这项工作。

\documentclass{article}
\usepackage{fancyvrb}

\newsavebox{\mybox}

\makeatletter
% Saves single line verbatim content into savebox from a file
\newcommand{\SaveVerbInput}[1]{%
    \sbox{\mybox}{{%
        \let\do\@makeother
        \dospecials
        \@vobeyspaces
        \frenchspacing
        \@noligs
        \verbatim@font
        \input{#1}%
    }}%
}
\makeatother

\begin{document}

\SaveVerbInput{v}

Width is: \the\wd\mybox.

Text is: \usebox{\mybox}

\end{document}

相关内容