用和包围的\title
宏给出了使用语言的预期结果(在“?”、“!”、“:”和“;”之前添加了空格):\shorthandon{;:!?}
\shorthandoff{;:!?}
babel
french
\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}
。