是否可以使用该listings
包以两步的方式引入十六进制行号?
在 MWE 中
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}
\lstset{basicstyle={\ttfamily\small}}
\lstset{keywordstyle={\bfseries}}
\lstset{numbers=left, numberstyle=\sffamily\tiny}
\begin{document}
\begin{lstlisting}[language={[x86masm]Assembler}]
mov ax, [10]
jz 0A
add bx, [11]
dec ax
jmp 02
mov [12], bx
hlt
\end{lstlisting}
\end{document}
我想要实现打印00
,,,,,,02
而不是阿拉伯行号。04
06
08
0A
0C
答案1
这是一个使用xintbinhex
十六进制数包的解决方案,calc
以 2 为步长进行计数,并更新\thelstnumber
编号命令,如listings
文档中所示:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{xintbinhex}
\usepackage{calc}
\lstset{basicstyle={\ttfamily\small}}
\lstset{keywordstyle={\bfseries}}
\lstset{numbers=left, numberstyle=\sffamily\tiny}
\renewcommand*\thelstnumber{\ifnum\value{lstnumber}<8 0\fi \xintDecToHex{\the\value{lstnumber}*2}}
\begin{document}
\begin{lstlisting}[language={[x86masm]Assembler},firstnumber=0]
mov ax, [10]
jz 0A
add bx, [11]
dec ax
jmp 02
mov [12], bx
hlt
\end{lstlisting}
\end{document}
答案2
无需任何软件包,使用 TeX 算法,只需付出很少的努力,就可以做到这一点,因此xintbinhex
在这里使用它有点过分,但它确实有效。但它没有提供宏来填充给定数量的十六进制数字,我需要在这里对其进行编码。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}
\lstset{basicstyle={\ttfamily\small}}
\lstset{keywordstyle={\bfseries}}
\lstset{numbers=left, numberstyle=\ttfamily\tiny}
\usepackage{xintbinhex}
\makeatletter
\newcommand\myHexNumber[1]{\ttfamily\tiny
\romannumeral\expandafter\myHexNumber@pad
\romannumeral0\xintdectohex{#1}.}%
% change 2 into how many hex digits are asked for with leading 0s
% (I guess 2 or 3 ...)
\def\myHexNumber@pad#1.{\xintreplicate{2-\xintLength{#1}}{0}#1}
\makeatother
\begin{document}
\begin{lstlisting}[language={[x86masm]Assembler}, numberstyle=\myHexNumber]
mov ax, [10]
jz 0A
add bx, [11]
dec ax
hjmp 02
mov [12], bx
hlt
\end{lstlisting}
\end{document}
这张图片并不能真正证明它确实有效……但它确实有效,毫无疑问!但这是我错误地使用时造成的\sffamily
。现在已更正,\ttfamily
请看下一张图片。