不正确的字母常量

不正确的字母常量

我使用两个计数器(行起始线到)来指定我的列表中要打印的行范围:

  \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 中运行它们,没有出现错误,生成:

在此处输入图片描述

相关内容