Xung đột giữa amscd và unicode-math

Oct 12 2020

Sau khi chuyển sang gói unicode-math, gói amscd cho sơ đồ giao hoán không hoạt động nữa. Tôi không nhận được thông báo lỗi, nhưng các ký hiệu như @ và <được hiển thị trong đầu ra.

Tôi đính kèm một ví dụ gần như tối thiểu, đã hoạt động trước đây.

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{amscd}
\newcommand\xbf[1]{#1}
\newcommand\fg[1]{#1}
\newcommand\obf[1]{#1}
\newcommand\R{{R}}
\begin{document}
Diagram:
  \begin{equation*}
  \begin{CD}
    \obf{\omega} \in \R^{3\times 3} @<\xbf{Ad}_{\xbf{B}}<< \obf{\Omega} \in \R^{3\times 3} \\
    @A\hat{\ }AA @AA\hat{\ }A\\
    \fg{\omega}=\xbf{B}\fg{\Omega} \in\R^3 @<\xbf{B}<< \fg{\Omega}\in \R^3
  \end{CD}
  \end{equation*}
\end{document}

Trả lời

4 egreg Oct 12 2020 at 22:14

Các amscdThực hiện gói

\mathcode`@="8000

để làm cho @toán học hoạt động. Nó cũng thực thi \CDatkhi bắt đầu một CDmôi trường, nơi \CDatđược xác định bởi

\gdef\CDat{\let @=\Iat}

trong bối cảnh @đang hoạt động. Không quan trọng để biết \Iatlà gì , chỉ là điều cần thiết @là toán học hoạt động và có ý nghĩa \Iattrong quá trình xử lý CDmôi trường.

Thật không may, việc unicode-mathchuẩn hóa các mã toán học tại \begin{document}, vì vậy cài đặt của mã toán học @bị quên.

Bạn thực sự có thể cải thiện định nghĩa của CDmôi trường để trở nên độc lập với các điều kiện xung quanh (điều này lẽ ra cũng nên được thực hiện bởi amscdgói, nhưng có những lý do lịch sử cho việc này).

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{amscd}
\usepackage{unicode-math}

\begingroup\lccode`~=`@ \lowercase{\endgroup
  \def\CDat{\let~\Iat\mathcode`@="8000\relax}%
}

\newcommand\xbf[1]{#1}
\newcommand\fg[1]{#1}
\newcommand\obf[1]{#1}
\newcommand\R{{R}}

\begin{document}
Diagram:
  \begin{equation*}
  \begin{CD}
    \obf{\omega} \in \R^{3\times 3} @<\xbf{Ad}_{\xbf{B}}<< \obf{\Omega} \in \R^{3\times 3} \\
    @A\hat{\ }AA @AA\hat{\ }A\\
    \fg{\omega}=\xbf{B}\fg{\Omega} \in\R^3 @<\xbf{B}<< \fg{\Omega}\in \R^3
  \end{CD}
  \end{equation*}
\end{document}

Ngoài ra, với việc phát hành cuối cùng của LaTeX (2020/10/01), bạn có thể thay thế ba dòng mã từ \begingroupđể }có

\AtBeginEnvironment{CD}{\mathcode`@="8000\relax}

mặc dù điều này ít hấp dẫn hơn đối với tôi.

Với tikz-cd:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{tikz-cd}

\newcommand\xbf[1]{#1}
\newcommand\fg[1]{#1}
\newcommand\obf[1]{#1}
\newcommand\R{{R}}

\begin{document}

Diagram:
\begin{equation*}
  \begin{tikzcd}
  \obf{\omega} \in \R^{3\times 3} &
  \obf{\Omega} \in \R^{3\times 3} \arrow[l,"\xbf{Ad}_{\xbf{B}}"']
  \\
  \fg{\omega}=\xbf{B}\fg{\Omega} \in\R^3  \arrow[u,"\hat{\ }"] &
  \fg{\Omega}\in \R^3 \arrow[l,"\xbf{B}"'] \arrow[u,"\hat{\ }"]
  \end{tikzcd}
\end{equation*}

\end{document}

3 UlrikeFischer Oct 12 2020 at 20:44

Nó dường như hoạt động trở lại nếu bạn đặt lại mã toán học của @:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amscd}
\usepackage{unicode-math}
\newcommand\xbf[1]{#1}
\newcommand\fg[1]{#1}
\newcommand\obf[1]{#1}
\newcommand\R{{R}}
\begin{document}


Diagram:
  \begin{equation*}\mathcode`\@="8000
  \begin{CD}
    \obf{\omega} \in \R^{3\times 3} @<\xbf{Ad}_{\xbf{B}}<< \obf{\Omega} \in \R^{3\times 3} \\
    @A\hat{\ }AA @AA\hat{\ }A\\
    \fg{\omega}=\xbf{B}\fg{\Omega} \in\R^3 @<\xbf{B}<< \fg{\Omega}\in \R^3
  \end{CD}
  \end{equation*}
\end{document}