我在扩展受保护标签内的变量时遇到了一些麻烦。我需要一个带有标签的自动标题,该标签全部位于命令内。我希望在标题内有一个两位数(padzeroes)。为此,我必须使用临时变量。
\newcommand{\Spezifikation}[5]{ %
\setcounter{tmpa}{#2}
%
\begin{minipage}{0.85\linewidth}
\captionof{spezifikation}{S\textunderscore#1
\hspace{-1.5ex}
\textunderscore\hspace{-0.85ex}\padzeroes[2]{\decimal{tmpa}}}
\protect\label{spec: #5}
\end{minipage}
}
这是 .aux 文件中的部分:
test.aux:\@writefile{lspec}{\defcounter {refsection}{0}\relax }\@writefile{lspec}{\contentsline {spezifikation}{\numberline {}{\ignorespaces S\textunderscore SYS \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\@decimal {1}}\relax }}{11}{spezifikation.1}}
test.aux:\newlabel{spec: SYS-Modularisierung}{{1}{11}{S\textunderscore SYS \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\decimal {tmpa}}\relax \relax }{spezifikation.1}{}}
.lspec 文件
test.lspec:\contentsline {spezifikation}{\numberline {}{\ignorespaces S\textunderscore SYS \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\@decimal {1}}\relax }}{11}{spezifikation.1}
我认为,问题在于在其他行中它的扩展tmpa
已经test.aux:\newlabel{...
很好地扩展到了后面的数字。
我该如何修复它?
补充1:
如果我改变
\padzeroes [2]{\decimal {tmpa}}
到
\padzeroes[2]{\decimalnum{#2}}
我收到此错误:
Missing \endcsname inserted
通常情况下是这样的。但在这种情况下(在标题中)却不是这样。我不明白为什么。
加法 2
这是一个简短的可执行文件:
\documentclass[,12pt,a4paper,twoside,onecolumn,notitlepage]{article}
\usepackage[onehalfspacing]{setspace}
\usepackage[a4paper,
inner=40mm, outer=20mm,
top=25mm, bottom=25mm,
headheight=15mm, headsep=7mm
]{geometry}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % Load the TS1-encoding e.g. through textcomp
\usepackage{verbatim, environ}
\setlength{\parindent}{0mm}
\usepackage{newfloat,tocloft,caption,multicol,suffix,fmtcount,nameref}
\newcounter{tmpa}
\newcommand{\Spezifikation}[5]{ %
\setcounter{tmpa}{#2}
%
\begin{center}
\begin{minipage}{0.85\linewidth}
\vspace*{0.7ex}
\captionof{spezifikation}{S\textunderscore#1
\hspace{-1.5ex}
\textunderscore\hspace{-0.85ex}\padzeroes[2]{\decimal{tmpa}}}
\protect\label{spec: #5}
\textit{Inhalt:} #3\\[0.5ex]
\textit{Referenz:} #4\\[0.5ex]
\textit{EOS}
\vspace{0.7ex}
\end{minipage}
\end{center}
}
%
% float-Object einer Spezifikation
%
% Listenendung: lspec
%
\DeclareFloatingEnvironment[fileext = lspec, %
placement = h] %
{spezifikation}
\DeclareCaptionFormat{DCFs}{\raggedright \textit{Spec.-Nr.:} #3}
\captionsetup[spezifikation]{format = DCFs,
font = bf,
listformat = empty,
position = above}
\begin{document}
\Spezifikation{hallo}{1}{Text}{Text}{Label1}
\Spezifikation{hallo}{2}{Text}{Text}{Label2}
\Spezifikation{hallo}{3}{Text}{Text}{Label3}
\Spezifikation{hallo}{4}{Text}{Text}{Label4}
\nameref{spec: Label1}
\end{document}
您会看到我引用了第一个规范,但它给出了最后一个规范。我认为这是因为 tmpa。这显示了辅助:
\@writefile{lspec}{\contentsline {spezifikation}{\numberline {}{\ignorespaces S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\@decimal {1}}\relax }}{1}}
\newlabel{spec: Label1}{{1}{1}{S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\decimal {tmpa}}\relax \relax }{}{}}
\@writefile{lspec}{\contentsline {spezifikation}{\numberline {}{\ignorespaces S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\@decimal {2}}\relax }}{1}}
\newlabel{spec: Label2}{{2}{1}{S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\decimal {tmpa}}\relax \relax }{}{}}
\@writefile{lspec}{\contentsline {spezifikation}{\numberline {}{\ignorespaces S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\@decimal {3}}\relax }}{1}}
\newlabel{spec: Label3}{{3}{1}{S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\decimal {tmpa}}\relax \relax }{}{}}
\@writefile{lspec}{\contentsline {spezifikation}{\numberline {}{\ignorespaces S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\@decimal {4}}\relax }}{1}}
\newlabel{spec: Label4}{{4}{1}{S\textunderscore hallo \hspace {-1.5ex} \textunderscore \hspace {-0.85ex}\padzeroes [2]{\decimal {tmpa}}\relax \relax }{}{}}
引用是正确的,但它显示的标题文本是错误的。由于没有展开,tmpa
它给出了最后一个条目tmpa
。
答案1
问题不在于\protect\label
哪些内容是不需要的。真正的问题在于.aux
文件中写入的内容;标题文本未展开,因此\padzeroes[2]\decimal{tmpa}
按原样写入。
您必须扩展标题文本,但使用\padzeroes[2]{\decimal{tmpa}}
会阻止它,因为这两个命令不是完全可扩展的。
这是一个工作版本:
\documentclass[,12pt,a4paper,twoside,onecolumn,notitlepage]{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[onehalfspacing]{setspace}
\usepackage[a4paper,
inner=40mm, outer=20mm,
top=25mm, bottom=25mm,
headheight=15mm, headsep=7mm
]{geometry}
\usepackage{textcomp} % Load the TS1-encoding e.g. through textcomp
\usepackage{verbatim, environ}
\setlength{\parindent}{0mm}
\usepackage{newfloat,tocloft,caption,multicol,suffix,fmtcount,nameref}
\newcounter{tmpa}
\makeatletter
\newcommand{\mypad}[1]{\two@digits{\value{#1}}}
\newcommand{\Spezifikation}[5]{%
\setcounter{tmpa}{#2}%
\begin{center}
\begin{minipage}{0.85\linewidth}
\vspace*{0.7ex}
\begingroup\protected@edef\x{\endgroup
\protect\captionof{spezifikation}{S\textunderscore#1%
\textunderscore\mypad{tmpa}}}\x\label{spec: #5}
\textit{Inhalt:} #3\\[0.5ex]
\textit{Referenz:} #4\\[0.5ex]
\textit{EOS}
\vspace{0.7ex}
\end{minipage}
\end{center}
}
\makeatother
%
% float-Object einer Spezifikation
%
% Listenendung: lspec
%
\DeclareFloatingEnvironment[fileext = lspec, %
placement = h] %
{spezifikation}
\DeclareCaptionFormat{DCFs}{\raggedright \textit{Spec.-Nr.:} #3}
\captionsetup[spezifikation]{format = DCFs,
font = bf,
listformat = empty,
position = above}
\begin{document}
\Spezifikation{hallo}{1}{Text}{Text}{Label1}
\Spezifikation{hallo}{2}{Text}{Text}{Label2}
\Spezifikation{hallo}{3}{Text}{Text}{Label3}
\Spezifikation{hallo}{4}{Text}{Text}{Label4}
\nameref{spec: Label1}
\end{document}
注意定义中的虚假空格。我删除了\hspace
仅因为它们而必要的否定命令。
我添加了一个可扩展的填充宏;如果您需要超过五位数字,请扩展它。
\documentclass{article}
\makeatletter
\newcommand{\epadzeroes}[2]{%
\ifcase#1\or\or
\etwo@digits{#2}\or
\ethree@digits{#2}\or
\efour@digits{#2}\or
\efive@digits{#2}\fi
\number#2%
}
\newcommand\etwo@digits[1]{%
\ifnum#1<10 0\fi
}
\newcommand\ethree@digits[1]{%
\ifnum#1<100 0\fi
\ifnum#1<10 0\fi
}
\newcommand\efour@digits[1]{%
\ifnum#1<1000 0\fi
\ifnum#1<100 0\fi
\ifnum#1<10 0\fi
}
\newcommand\efive@digits[1]{%
\ifnum#1<10000 0\fi
\ifnum#1<1000 0\fi
\ifnum#1<100 0\fi
\ifnum#1<10 0\fi
}
\makeatother
\newcounter{tmpa}
\begin{document}
\setcounter{tmpa}{5}
\epadzeroes{2}{\value{tmpa}}
\epadzeroes{3}{\value{tmpa}}
\setcounter{tmpa}{9999}
\epadzeroes{5}{\value{tmpa}}
\end{document}