以下代码继续这个帖子和这个。以下代码没有它编译成功,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
。