![当 Latex 代码包含 \unicode{f818} 和 \unicode{f817} 时 pdflatex 崩溃以及如何处理](https://linux22.com/image/294753/%E5%BD%93%20Latex%20%E4%BB%A3%E7%A0%81%E5%8C%85%E5%90%AB%20%5Cunicode%7Bf818%7D%20%E5%92%8C%20%5Cunicode%7Bf817%7D%20%E6%97%B6%20pdflatex%20%E5%B4%A9%E6%BA%83%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86.png)
我不知道 Latex 代码(自动生成的代码无效)或者 pdflatex 是否能够处理此代码,但我需要找到正确的包。我查看了这个在 Latex 中输入 Unicode 字符并添加了那里提到的包。但仍然出现错误。也许我需要定义一个宏?我需要添加一个智能\DeclareUnicodeCharacter
来处理这个问题吗?有没有办法使用它\DeclareUnicodeCharacter
来使下面导致问题的这些 unicode 只是一个空格,以便 pdflatex 和 latex 可以处理该文件?
Mathematica 为其表达式之一生成 Latex 代码,该表达式使用特殊数学符号(字母上下的小点),如下所示关联
这是我的笔记本的屏幕截图,显示了生成的 Latex 代码
当我在文档中使用此 Latex 代码时,pdflatex.exe 实际上崩溃了(MikTex),并且 Linux 上的 texlive 也出现了错误:
(/usr/local/texlive/2014/texmf-dist/tex/latex/amsfonts/umsa.fd)
(/usr/local/texlive/2014/texmf-dist/tex/latex/amsfonts/umsb.fd)
! Undefined control sequence.
l.11 ...to \text{DifferentialRoot}\left(\{\unicode
{f818},\unicode{f817}\}
?
生成的代码很复杂,我无法手动编辑它,否则如果我开始移动部件,我将破坏生成的 Latex 代码(我还需要多次运行,因此需要一次性修复)
这是针对一个实际案例的 MWE。我有很多这样的案例,所以正在寻找一个可以放在 Latex 文档顶部的宏来解决所有这些\unicode
问题。删除所有这些 unicode 的解决方案也很好。符号不必在上方或下方有这些点,但这就是 Mathematica 生成它们的方式。但对于 pdf 文件,我实际上不需要它们。
\documentclass[12pt]{article}
\usepackage{amsmath,mathtools}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[mathletters]{ucs}
\usepackage[utf8]{inputenc}
\begin{document}
$\left\{\left\{y(x)\to \text{DifferentialRoot}\left(\{\unicode{f818},
\unicode{f817}\}
\unicode{f4a1}\left\{\left(a^2 \unicode{f817}^3+a\right)
\unicode{f818}(\unicode{f817})+\left(2 \unicode{f817}^3 a-1\right)
\unicode{f818}'(\unicode{f817})+\unicode{f817}
\unicode{f818}''(\unicode{f817})=0,
\unicode{f818}(1)=c_1,\unicode{f818}'(1)=c_2\right\}\right)(x)\right\}\right\}$
\end{document}
答案1
U+F817、U+F818 和 U+F4A1 指向私人使用区域,因此无法说出它们应该生成什么,因为它依赖于字体。
从你的照片来看,这封信似乎是
- U+F817 是
x
- U+F818 是
y
- U+F4A1 是
,
所以你可以
\makeatletter
\newcommand{\unicode}[1]{\@nameuse{unicode@#1}}
\newcommand{\unidef}[2]{\@namedef{unicode@#1}{#2}}
\makeatother
\unidef{f817}{x}
\unidef{f818}{y}
\unidef{f4a1}{,}
完整代码:
\documentclass[12pt]{article}
\usepackage{amsmath,mathtools}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
\makeatletter
\newcommand{\unicode}[1]{\@nameuse{unicode@#1}}
\newcommand{\unidef}[2]{\@namedef{unicode@#1}{#2}}
\makeatother
\unidef{f817}{x}
\unidef{f818}{y}
\unidef{f4a1}{,}
\begin{document}
$\left\{\left\{y(x)\to \text{DifferentialRoot}\left(\{\unicode{f818},
\unicode{f817}\}
\unicode{f4a1}\left\{\left(a^2 \unicode{f817}^3+a\right)
\unicode{f818}(\unicode{f817})+\left(2 \unicode{f817}^3 a-1\right)
\unicode{f818}'(\unicode{f817})+\unicode{f817}
\unicode{f818}''(\unicode{f817})=0,
\unicode{f818}(1)=c_1,\unicode{f818}'(1)=c_2\right\}\right)(x)\right\}\right\}$
\end{document}
我只能显示开头,因为公式由于\left
和的错误使用而无法破解\right
。编写 LaTeX 代码生成器的人似乎对 TeX 了解不多。
\left
删除所有and之后的排版结果如下\right
:
答案2
您可以在自动生成的文本之前添加以下代码:
\def\unicode#1{\csname U+#1\endcsname}
\def\unidef#1{\expandafter\def\csname U+#1\endcsname}
\unidef{f818}{{\bdot{\dot y}}}
\unidef{f817}{{\bdot{\dot x}}}
\unidef{f4a1}{,}
\def\bdot#1{\vtop{\offinterlineskip
\halign{\hfil##\hfil\cr$#1\vphantom y$\cr\noalign{\vskip1pt}.\cr}}}
% the text generated by Mathematica follows:
\documentclass[12pt]{article}
\usepackage{amsmath,mathtools}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[mathletters]{ucs}
\usepackage[utf8]{inputenc}
\begin{document}
$\left\{\left\{y(x)\to \text{DifferentialRoot}\left(\{\unicode{f818},
\unicode{f817}\}
\unicode{f4a1}\left\{\left(a^2 \unicode{f817}^3+a\right)
\unicode{f818}(\unicode{f817})+\left(2 \unicode{f817}^3 a-1\right)
\unicode{f818}'(\unicode{f817})+\unicode{f817}
\unicode{f818}''(\unicode{f817})=0,
\unicode{f818}(1)=c_1,\unicode{f818}'(1)=c_2\right\}\right)(x)\right\}\right\
\end{document}
我的意思是你需要在 x、y 的上方和下方打印点,因此\bdot
被定义。