扩展受保护标签内的变量

扩展受保护标签内的变量

我在扩展受保护标签内的变量时遇到了一些麻烦。我需要一个带有标签的自动标题,该标签全部位于命令内。我希望在标题内有一个两位数(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}

相关内容