在解决方案中使用制表系统使项目的逐项化更加容易,我正在计算空格的数量以确定要插入的前导字符的类型。但是,如果我用制表符替换前导空格,则解决方案不起作用。
如果我能检测到中的制表符literate
,那么我就可以适当地\ProcessSpace
增加计数器NumOfContigousSpaces
,但我不知道如何测试它?
我以为添加tabsize=4, keepspaces=true
就可以了,但这还不够。所以我尝试lstag@tabulator
使用如何自动跳过列表中的前导空格,但无法让它发挥作用。
下面的代码在W
第一行的 之前有 4 个前导空格,在第二行的 之前有一个制表符作为前导字符W
。这不会为带有制表符的行产生项目符号:
W
在两行之前使用 4 个空格可以看到正确的输出:
笔记:
- 此处发布的代码片段似乎用 4 个空格替换了制表符。因此,要使用下面的 MWE,您需要用字符替换前面的四个
Wxxx
空格tab
。
代码:
\documentclass{article}
\usepackage{pgf}
\usepackage{xstring}
\usepackage{listings}
\newcounter{NumOfContigousSpaces}%
\setcounter{NumOfContigousSpaces}{0}%
\newcommand{\Width}{1}%
\newcommand*{\AddApproriateBulletIfFirstChar}[1]{%
\pgfmathtruncatemacro{\BulletType}{\arabic{NumOfContigousSpaces}/4}%
\IfEqCase{\BulletType}{%
{0}{\gdef\Width{1}}
{1}{\gdef\Width{3}$\bullet$ }
{2}{\gdef\Width{3}$\circ$ }
{3}{\gdef\Width{3}$\times$ }
{4}{\gdef\Width{3}$\star$ }
{5}{\gdef\Width{3}$-$ }
}[\gdef\Width{3}$\bullet$ ]%
#1%
\setcounter{NumOfContigousSpaces}{0}%
}%
\newcommand*{\ProcessSpace}{%
\addtocounter{NumOfContigousSpaces}{1}%
\space%
}%
\newcommand*{\ProcessTab}{%
\addtocounter{NumOfContigousSpaces}{4}%
\space\space\space\space%
}%
\makeatletter
\lstdefinestyle{MyItemize}{%
basicstyle=\ttfamily,
columns=flexible,
tabsize=4, keepspaces=true,
literate=%
{\ }{{{\ProcessSpace}}}1% Count contigous spaces
{lstag@tabulator}{{{\ProcessTab}}}4% ??? how detect a tab?
%
%--- much code removed here (See https://tex.stackexchange.com/questions/57939/making-more-easy-the-itemized-of-item-with-tabulation-system for full code)
{W}{{{\AddApproriateBulletIfFirstChar{W}}}}\Width
{x}{{{\AddApproriateBulletIfFirstChar{x}}}}\Width
}%
\makeatother
\begin{document}
\begin{lstlisting}[style=MyItemize]
Wxxx xxx
Wxxx xx xx
\end{lstlisting}
\end{document}
答案1
使用\^^I
是在选项卡中输入的“安全”方式,并将让列表进行转换。
lstag@tabulator
用以下内容替换该行:
{\^^I}{{{\ProcessTab}}}4%
生成:
(设置时使用的字符宽度似乎有问题columns = flexible
,因为“制表符”项目符号使用的空间与“四个空格”项目符号使用的空间不同。)
答案2
您可以尝试以下方法:
\lstset{
...
tab=$\bullet$\space,
showtabs=true,
...
}