markboth 的问题

markboth 的问题

我正在使用isodate

  1. 用户应将日期作为章节标题插入,格式如下:31/12/1987
  2. 本章应有标题31st Dec 1987

我在这里发布了一些帖子,得出的结论是:

\documentclass{book}
\usepackage[orig,british]{isodate}
\usepackage{blindtext}
\makeatletter
\def\short@month@english{\ifcase\month\or
    Jan\or Feb\or Mar\or Apr\or May\or Jun\or
    Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi}
\newcommand{\printshortdate}[1]{{%
  \let\month@english\short@month@english% Update English month lookup (locally)
  \printdate{#1}}}% Call traditional \printdate
\newcommand{\printsupdate}[1]{{
 \let\day@english\supday@english
 \printdate{#1}
}}
\makeatother
\newcommand{\chaplab}[1]{\label{chap:#1}}
\begin{document}
\chapter{\printshortdate{31/12/1987}}
 \blindtext
 \blindtext
 \blindtext
 \blindtext
 \blindtext
 \blindtext
\end{document}

但是\markboth,如果我删除\blindtext命令,文档就只有一页,一切都正常,而添加文本时,我会收到错误,并且标题中的章节名称会变得一团糟。我希望标题完全正确31st Dec 1987

已添加注释

我使用它是isodate因为在同一个文档中我需要相同的日期但采用其他格式,并且作为用户我只想插入一次。

答案1

为了转到移动参数,您的命令必须强大。

诀窍是替换newcommandDeclareRobustCommand

以下是代码:

\documentclass{book}
\usepackage[orig,british]{isodate}
\usepackage{lipsum}
\makeatletter
\def\short@month@english{\ifcase\month\or
    Jan\or Feb\or Mar\or Apr\or May\or Jun\or
    Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi}

\DeclareRobustCommand{\printshortdate}[1]{%
  \let\month@english\short@month@english% Update English month lookup (locally)
  \printdate{#1}%
  }% Call traditional \printdate

\makeatother


\begin{document}
\chapter{\printshortdate{31/12/1987}}
 \lipsum[4-12]
\end{document}

带有输出(第 2 页):

在此处输入图片描述

请注意,我删除了一些多余的{s(在newcommand定义中)

答案2

如果你只需要一个章节使用

\chapter*{\printshortdate{31/12/1987}}

如果它不应该出现在目录中,或者

\chapter{\protect\printshortdate{31/12/1987}}  

当然,这与另一个答案的解决方案相同。

相关内容