T4 +`\|` 给出奇怪的`\mathaccent` 错误

T4 +`\|` 给出奇怪的`\mathaccent` 错误

以下代码:

\documentclass{article}

\usepackage[cp1250]{inputenc}
\usepackage[T4]{fontenc}
%\usepackage[OT4]{fontenc}
%\usepackage{polski}

\usepackage{amsmath,amssymb}
\usepackage{enumerate}

\def\re{\mathbb{R}}

\begin{document}


\begin{enumerate}
\item
Sprawdzić, czy są normami na $\re^2$:
\begin{enumerate}[a)]
\item
$\|(x_1,x_2)\|=(|x_1|^{1/2}+|x_2|^{1/2})^2$,
\item
$\|(x_1,x_2)\|=|x_1|^2+|x_2|^2$,
\item
$\|(x_1,x_2)\|=
\begin{cases}
\|(x_1,x_2)\|_2,&\text{gdy $x_1x_2>0$},\\ %this is line 27
\|(x_1,x_2)\|_1,&\text{gdy $x_1x_2\leq0$}.
\end{cases}
$
\end{enumerate}
\item
Niech $\|{}.{}\|_1$ i $\|{}.{}\|_2$ będą dowolnymi (nie tylko $l_2^p$, jak w poprzednim przykładzie)  normami. Czy jest normą $\frac12(\|{}.{}\|_1+\|{}.{}\|_2)$?
\end{enumerate}

\end{document}

给出错误信息

! Please use \mathaccent for accents in math mode.
\add@accent ...@spacefactor \spacefactor }\accent 
                                              #1 #2\egroup \spacefactor ...
l.27 \|
   (x_1,x_2)\|_2,&\text{gdy $x_1x_2>0$},\\ %this is line 27
? 

\usepackage[T4]{fontenc}用下面注释的其中一行替换后,所有代码都可以编译,不会出错。请注意\|,之前在代码中使用时没有任何问题。

我知道如何纠正文件以获得开场规范(\|),但我的问题是:这种奇怪行为的根源是什么?

答案1

该文件t4enc.def确实

\def\|{\ifmmode\Vert\else\I\fi}% single universal accent

其中缺少一个重要的部分,即首字母\relax。使用较新版本的 LaTeX,最好进行定义\protected

所发生的情况是,对\|incases进行检查和扩展,以查看它是否以以下方式开头\omit(表格中的标准行为),进入当前单元格的数学模式,因此遵循错误分支。

\documentclass{article}

\usepackage[utf8]{inputenc} % I can't use cp1250
\usepackage[T4]{fontenc}
%\usepackage[OT4]{fontenc}
%\usepackage{polski}

\usepackage{amsmath,amssymb}
\usepackage{enumerate}

\newcommand\re{\mathbb{R}}

% fix the bad definition in t4enc.def
%\def\|{\relax\ifmmode\Vert\else\I\fi}% single universal accent
\protected\def\|{\ifmmode\Vert\else\I\fi}% single universal accent

\begin{document}


\begin{enumerate}
\item
Sprawdzić, czy są normami na $\re^2$:
\begin{enumerate}[a)]
\item
$\|(x_1,x_2)\|=(|x_1|^{1/2}+|x_2|^{1/2})^2$,
\item
$\|(x_1,x_2)\|=|x_1|^2+|x_2|^2$,
\item
$\|(x_1,x_2)\|=
\begin{cases}
\|(x_1,x_2)\|_2,&\text{gdy $x_1x_2>0$},\\ %this is line 27
\|(x_1,x_2)\|_1,&\text{gdy $x_1x_2\leq0$}.
\end{cases}
$
\end{enumerate}
\item
Niech $\|{}.{}\|_1$ i $\|{}.{}\|_2$ będą dowolnymi (nie tylko $l_2^p$, jak w poprzednim przykładzie)  normami. Czy jest normą $\frac12(\|{}.{}\|_1+\|{}.{}\|_2)$?
\end{enumerate}

\end{document}

在此处输入图片描述

重要的提示

T4 编码是不是波兰语;它与 OT4 没有任何对应关系(数字除外)。波兰语完全由 T1 编码覆盖。

T4 是做什么用的?用于非洲语言。

这是相同的\usepackage[T1]{fontenc}(并删除了的重新定义\|

在此处输入图片描述

你能发现区别吗?是的,T4 编码字体仅在该cmr系列中可用,并且仅限位图

答案2

缩小示例以使其更简洁一些,一种解决方法是保存其定义\|并恢复它。

\documentclass{article}
\usepackage[utf8]{inputenc}
\let\oldmacro\|
\usepackage[T4]{fontenc}
\let\|\oldmacro

\usepackage{amsmath}%,amssymb}

\begin{document}
$\|(x_1,x_2)\|=
\begin{cases}
  \|(x_1,x_2)\|_2,&\text{gdy $x_1x_2>0$},\\ %this is line 27
\end{cases}
$
\end{document}

问题是T4.def改变了的定义,\|以致于它不再被指定为分隔符:

\delimiter "026B30D .

在加载编码之前是原始定义,而在加载编码之后

\ifmmode \Vert \else \I \fi

我不太了解细节,无法彻底解释为什么这会导致特定的问题,但是 TeX 不喜欢这里\ifmmode。 (\Vert本身工作正常。或者,至少没有错误。)

相关内容