我认为 babel 与 refcount 有冲突

我认为 babel 与 refcount 有冲突

以下代码继续这个帖子这个。以下代码没有它编译成功,babel但有它编译失败。请参见下面的控制台输出。有没有什么办法可以解决这个问题?

\documentclass{article}
\usepackage{afterpage}
\usepackage[french]{babel} % no error if uncommented
\usepackage{mwe}
\usepackage{refcount}
\usepackage{tocloft}
\usepackage{xparse}
\usepackage{xwatermark} % ruled out

\newlistof{encl}{encl}{List of enclosed items}

\NewDocumentCommand
{\addencl}
{ m }
{
  \refstepcounter{encl}
  \addcontentsline{encl}{encl}{\theencl. #1}
}

\NewDocumentCommand
{\getencl}
{ m }
{
  E{\small NCL} \# \getrefnumber{#1}
}

\begin{document}
\newwatermark*[page=\getpagerefnumber{encl:bar}]{Bar}
\newwatermark*[page=\getpagerefnumber{encl:foo}]{Foo}

\listofencl

%\verb|\getrefnumber{encl:foo}|:\getrefnumber{encl:foo}
%\verb|\getpagerefnumber{encl:foo}|:\getpagerefnumber{encl:foo}

\getencl{encl:bar}~is~on~page~\getpagerefnumber{encl:bar}

\getencl{encl:foo}~is~on~page~\getpagerefnumber{encl:foo}

\newpage

%\refstepcounter{encl}
\addencl{Bar}\label{encl:bar}
\includegraphics[width=\linewidth]{example-image-a}

\newpage

\addencl{Foo}\label{encl:foo}
\includegraphics[width=\linewidth]{example-image-b}

%\newwatermark*{}


\end{document}

控制台输出:

错误:缺少插入的 \endcsname。

--- TeX 说 --- \unskip l.36 \getencl{encl:bar} ~is~on~page~\getpagerefnumber{encl:bar} --- 帮助 --- 来自 .log 文件...

标记的控制序列不应该出现在 \csname 和 \endcsname 之间。

答案1

babel-french处于活动状态时,冒号具有特殊含义:“删除可能的空格,添加不间断空格并打印冒号”。

事实上,你得到了

! Missing \endcsname inserted.
<to be read again> 
                   \unskip 

LaTeX 规定,\ref\pageref可以处理babel诸如:?和等!法语和德语的简写。使用或 则"无法做到这一点\getrefnumber\getpagerefnumber,因为保护需要作业,在这种情况下设置一个开关,以便冒号速记例如产生一个标准冒号。

命令refcount想要和需要完全可扩展,因此在工作期间不能进行任何任务:可扩展性就是其refcount诞生的特性。

一般来说,我建议避免babel在标签中使用简写。

对于您的特定问题,如果您在 的参数中不使用宏\get(page)refnumber,则可以使用\detokenize

\documentclass{article}
\usepackage[french]{babel} % no error if uncommented
\usepackage{refcount}
\usepackage{tocloft}
\usepackage{xparse}
\usepackage{xwatermark} % ruled out

\newlistof{encl}{encl}{List of enclosed items}

\NewDocumentCommand{\addencl}{ m }
 {%
  \refstepcounter{encl}%
  \addcontentsline{encl}{encl}{\theencl. #1}%
 }

\NewDocumentCommand{\getencl}{ m }
 {%
  E{\small NCL} \# \getrefnumber{\detokenize{#1}}%
 }

\newcommand{\bgetpagerefnumber}[1]{\getpagerefnumber{\detokenize{#1}}}

\begin{document}

\newwatermark*[page=\bgetpagerefnumber{encl:bar}]{Bar}
\newwatermark*[page=\bgetpagerefnumber{encl:foo}]{Foo}

\listofencl

\getencl{encl:bar}~is~on~page~\bgetpagerefnumber{encl:bar}

\getencl{encl:foo}~is~on~page~\bgetpagerefnumber{encl:foo}

\newpage

%\refstepcounter{encl}
\addencl{Bar}\label{encl:bar}
\includegraphics[width=\linewidth]{example-image-a}

\newpage

\addencl{Foo}\label{encl:foo}
\includegraphics[width=\linewidth]{example-image-b}

%\newwatermark*{}


\end{document}

但使用就简单多了encl-foo

答案2

\string::多个位置使用它就会起作用。

\documentclass{article}
\usepackage{afterpage}
\usepackage[french]{babel} % no error if uncommented
\usepackage{mwe}
\usepackage{refcount}
\usepackage{tocloft}
\usepackage{xparse}
\usepackage{xwatermark} % ruled out

\newlistof{encl}{encl}{List of enclosed items}

\NewDocumentCommand
{\addencl}
{ m }
{
  \refstepcounter{encl}
  \addcontentsline{encl}{encl}{\theencl. #1}
}

\NewDocumentCommand
{\getencl}
{ m }
{
  E{\small NCL} \# \getrefnumber{#1}
}

\begin{document}
\newwatermark*[page=\getpagerefnumber{encl\string:bar}]{Bar}
\newwatermark*[page=\getpagerefnumber{encl\string:foo}]{Foo}

\listofencl

%\verb|\getrefnumber{encl:foo}|:\getrefnumber{encl:foo}
%\verb|\getpagerefnumber{encl:foo}|:\getpagerefnumber{encl:foo}

\getencl{encl\string:bar}~is~on~page~\getpagerefnumber{encl\string:bar}

\getencl{encl\string:foo}~is~on~page~\getpagerefnumber{encl\string:foo}

\newpage

%\refstepcounter{encl}
\addencl{Bar}\label{encl:bar}
\includegraphics[width=\linewidth]{example-image-a}

\newpage

\addencl{Foo}\label{encl:foo}
\includegraphics[width=\linewidth]{example-image-b}

%\newwatermark*{}


\end{document}

输出:

在此处输入图片描述

注意:我最初\detokenize向文档中添加了定义的命令,但仍然存在问题\getpagerefnumber

相关内容