ความขัดแย้งระหว่าง amscd และ unicode-math

Oct 12 2020

หลังจากเปลี่ยนไปใช้แพ็กเกจ Unicode-math แล้วแพ็กเกจ amscd สำหรับไดอะแกรมสับเปลี่ยนจะไม่ทำงานอีกต่อไป ฉันไม่ได้รับข้อความแสดงข้อผิดพลาด แต่สัญลักษณ์เช่น @ และ <แสดงอยู่ในเอาต์พุต

ฉันแนบตัวอย่างที่เกือบเรียบง่ายซึ่งใช้งานได้มาก่อน

\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}

คำตอบ

4 egreg Oct 12 2020 at 22:14

amscdแพคเกจการดำเนินการ

\mathcode`@="8000

เพื่อให้@คณิตศาสตร์มีความกระตือรือร้น นอกจากนี้ยังดำเนินการ\CDatเมื่อเริ่มต้นCDสภาพแวดล้อมที่\CDatกำหนดโดย

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

ในบริบทที่@ใช้งานอยู่ ไม่สำคัญที่จะต้องรู้ว่าอะไร\Iatคือสิ่งที่จำเป็นเพียงแค่ต้อง@มีการเคลื่อนไหวทางคณิตศาสตร์และมีความหมาย\Iatระหว่างการประมวลผลCDสภาพแวดล้อม

น่าเสียดายที่unicode-mathรหัสคณิตศาสตร์เป็นมาตรฐานที่\begin{document}ดังนั้นการตั้งค่ารหัสคณิตศาสตร์ของ@จึงถูกลืม

คุณสามารถปรับปรุงคำจำกัดความของCDสภาพแวดล้อมเพื่อให้เป็นอิสระจากสภาพแวดล้อมได้ (ซึ่งamscdแพ็คเกจควรทำเช่นกัน แต่มีเหตุผลทางประวัติศาสตร์ที่ไม่ทำเช่นนั้น)

\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}

หรืออีกวิธีหนึ่งคือ LaTeX รุ่นล่าสุด (2020-10-01) คุณสามารถแทนที่โค้ดสามบรรทัดจาก\begingroupถึง}ด้วย

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

แม้ว่าสิ่งนี้จะไม่น่าสนใจสำหรับฉัน

ด้วย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

ดูเหมือนว่าจะใช้งานได้อีกครั้งหากคุณรีเซ็ตรหัสคณิตศาสตร์ของ @:

\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}