Почему \shorthandon и \shorthandoff нельзя встроить в другие макросы?

Почему \shorthandon и \shorthandoff нельзя встроить в другие макросы?

Окружение \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

Saying \shorthandon{?}делает ?активный символ. Таким образом, когда аргумент to \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}.

Связанный контент