为什么 \shorthandon 和 \shorthandoff 不能嵌入到其他宏中?

为什么 \shorthandon 和 \shorthandoff 不能嵌入到其他宏中?

用和包围的\title宏给出了使用语言的预期结果(在“?”、“!”、“:”和“;”之前添加了空格):\shorthandon{;:!?}\shorthandoff{;:!?}babelfrench

\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
%
\shorthandon{;:!?}%
\title{La crise? Quelle crise?}
\shorthandoff{;:!?}%
%
\begin{document}
\maketitle
\end{document}

\shorthandon但是,如果和\shorthandoff嵌入在宏(的重新定义)中,则此方法不起作用\title

\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
%
\let\titleORI\title
\renewcommand{\title}[1]{%
  \shorthandon{;:!?}%
  \titleORI{#1}%
  \shorthandoff{;:!?}%
}
%
\title{La crise? Quelle crise?}
\author{Un auteur? Deux auteurs!}
%
\begin{document}
\maketitle
\end{document}

这是什么原因? 有解决方法吗?

答案1

\shorthandon{?}?主动字符。因此,当 的参数\title被吸收时,在第一个例子中,它是主动的,并且在 时\maketitle,LaTeX 将使用它的当前定义,而这恰好是 定义的定义babel-french

相反,在第二种情况下,\shorthandon当参数\title已经被吸收时,命令就会执行,?因此它不活跃,并且会永远保留(在的替换文本中,这是存储标题\@title的宏)。\title

您必须在\shorthandon执行之后延迟读取该参数。

\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}

\let\ORItitle\title
\renewcommand{\title}{%
  \shorthandon{;:!?}%
  \titlewithshorthand
}
\newcommand{\titlewithshorthand}[1]{%
  \ORItitle{#1}%
  \shorthandoff{;:!?}%
}

\title{La crise? Quelle crise?}

\begin{document}
\maketitle
\end{document}

但我只是将其放置\title在之后\begin{document}

相关内容