我使用两个计数器(行起始和线到)来指定我的列表中要打印的行范围:
\setcounter{linefrom}{1}
\setcounter{lineto}{5}
以下内容通过编译并按预期工作:
\lstinputlisting[linerange={1-\value{lineto}}]{
...
}
以下操作会产生错误:
\lstinputlisting[linerange={\value{linefrom}-\value{lineto}}]{
...
}
错误是:
! Improper alphabetic constant.
<to be read again>
\value
有人能告诉我吗? 最小工作示例可从以下网址获取:https://gist.github.com/3187943
\documentclass [11pt,oneside,onecolumn]{article}
\usepackage{listings}
\usepackage{tikz}
\usepackage{filecontents}
\begin{filecontents*}{hello.c}
#include <stdio.h>
int main(void) {
printf("Hello World!\n");
// return 0;
}
\end{filecontents*}
\lstset{
numbers=left,
basicstyle=\footnotesize,
aboveskip=0pt,
belowskip=0pt,
showlines = true
}
\lstdefinestyle{highlight}{
backgroundcolor=\color{orange}
}
\newcounter{linefrom}
\newcounter{lineto}
\makeatletter
\def\code{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]#2{
\setcounter{linefrom}{1}
\foreach \x in {#1}{
\setcounter{lineto}{\x}
\addtocounter{lineto}{-1}
\lstinputlisting[linerange={1-\thelineto}]{
#2
}
\addtocounter{linefrom}{\x}
\addtocounter{linefrom}{-1}
\addtocounter{lineto}{1}
\lstinputlisting[linerange={4-\thelineto},style=highlight,firstnumber=last]{
#2
}
\addtocounter{linefrom}{1}
}
\lstinputlisting[firstline=\the\value{linefrom},firstnumber=last]{
#2
}
}
\def\@without#1{
\lstinputlisting[]{
#1
}
}
\makeatother
\begin{document}
\code[4]{hello.c}
\end{document}
答案1
似乎linerange
希望看到一个明确的数字作为开始。所以我们给出一个:
\def\@with[#1]#2{
\setcounter{linefrom}{1}
\foreach \x in {#1}{
\setcounter{lineto}{\x}
\addtocounter{lineto}{-1}
\lstinputlisting[linerange={1-\thelineto}]{
#2
}
\addtocounter{linefrom}{\x}
\addtocounter{linefrom}{-1}
\addtocounter{lineto}{1}
\begingroup\edef\y{\endgroup
\noexpand\lstinputlisting[linerange=\thelinefrom-\thelineto,style=highlight,firstnumber=last]}%
\y{#2}
\addtocounter{linefrom}{1}
}
\lstinputlisting[firstline=\thelinefrom,firstnumber=last]{#2}
}
将\edef
完全扩展\thelinefrom
并且\thelineto
。
答案2
我至少可以告诉你这个错误意味着什么。字母常量使用反引号来获取字母的字符代码:
$ tex
This is TeX, Version 3.1415926 (TeX Live 2012)
**\relax
*\count0=`a
*\showthe\count0
> 97.
显示的错误是如果您在反引号后放置一个未扩展为字符标记的命令时会出现的错误:
*\count0=`\hfill
! Improper alphabetic constant.
<to be read again>
\hfill
由于没有提供 MWE,我没有尝试重现,但您可能更好地使用\thelinefrom
和\thelineto
而不是使用,\value
因为它们将扩展为值中数字的字符标记。
我复制了您链接的文件并在 texlive 2012 中运行它们,没有出现错误,生成: