当谈到 tex4ht 时,在 Latex 中使用 Matlab 代码似乎是失败的案例。
我改用matlab-prettifier
package 而不是mcode
package 在 Latex 中加载 Matlab 代码,因为我发现 tex4ht 使用 mcode 存在太多问题。我已经发布了 2 个相关问题。mcode-package-with-tex4ht-and-lualatex-produce-invalid-html-for-strings-in-matla 和 tex4ht 使用 mcode 包时会对某些 matlab 代码进行打乱
现在我发现使用matlab-prettifier
包的另一个问题。问题是,使用时,字符串引号会从 Matlab 代码中删除,而使用相同代码\lstinputlisting
时,字符串引号会被删除。lstlisting
我尝试过更改,escapechar
但没有任何效果。这是 MWE
\documentclass[12pt]{article}%
\usepackage[T1]{fontenc}
\usepackage[utf8]{luainputenc}
\usepackage{amsmath,mathtools}
\usepackage[numbered,framed]{matlab-prettifier}
\lstset{
style = Matlab-editor,
basicstyle = \mlttfamily,
escapechar = `,
mlshowsectionrules = true,
}
\begin{document}
\lstinputlisting{foo_x.m}
\begin{lstlisting}[language=Matlab,style=Matlab-editor]
% ode45 "is based on an explicit Runge-Kutta formula...
% program"
%
function foo_x
clear; clf; clc;
x=10;
fprinf('this is %d\n',x);
end
\end{lstlisting}
\end{document}
文件中的代码 foo_x.m
与上面显示的 latex 文件中的代码相同。完全相同的列表。为了节省您制作foo_x.m
和复制代码以重现此内容的时间,这里是链接到 m 文件
这是 make4ht 在 HTML 中生成的内容:
注意同一代码的第一个清单和第二个清单之间的区别。第一个清单中的字符串没有单引号。
使用编译
make4ht --lua -u foo.tex
以下是 lualatex 生成的结果。两种情况下的代码相同。
我\usepackage[utf8]{luainputenc}
从 MWE 中删除了它,但没有什么区别。我可以继续尝试添加和删除包并更改选项,但这真的很累。似乎在 Listing with 中使用 Matlab 代码make4ht --lua
是一个问题。当我删除该--lua
选项时,它可以工作:
make4ht -u foo.tex
但我需要使用--lua
选项make4ht
。那么解决方案是什么?
Linux 上的 TL 2015。
答案1
我发现了问题。tex4ht\lstset
的工作方式与 lualatex 不同。当我将选项的顺序更改为时,\lstset
问题就消失了!我只需更改
\lstset{
language = Matlab,
style = Matlab-editor,
basicstyle = \mlttfamily,
escapechar = `,
mlshowsectionrules = true
}
到
\lstset{
basicstyle = \mlttfamily,
language = Matlab,
style = Matlab-editor,
escapechar = `,
mlshowsectionrules = true
}
现在字符串引号就在那里!移动到language= Matlab
上面basicstyle= \mlttfamily
又把问题带回来了。所以解决方案是这样的
\documentclass[12pt]{article}%
\usepackage[T1]{fontenc}
\usepackage[utf8]{luainputenc}
\usepackage{amsmath,mathtools}
\ifdefined\HCode
\usepackage{matlab-prettifier}
\lstset{
basicstyle = \mlttfamily,
language = Matlab,
style = Matlab-editor,
escapechar = `,
mlshowsectionrules = true
}
\else
\usepackage[numbered,framed]{matlab-prettifier}
\lstset{
language = Matlab,
style = Matlab-editor,
basicstyle = \mlttfamily,
escapechar = `,
mlshowsectionrules = true
}
\fi
\begin{document}
Now showing lstinputlisting
\lstinputlisting{foo_x.m}
Now showing lstlisting
\begin{lstlisting}[language=Matlab,style=Matlab-editor]
% ode45 "is based on an explicit Runge-Kutta formula...
% program"
%
function foo_x
clear; clf; clc;
x=10;
fprinf('this is %d\n',x);
end
\end{lstlisting}
\end{document}
以下是结果make4ht --lua -u foo.tex
我发现的另一个问题是,如果我使用\usepackage{times}
tex4ht,代码周围的引号也会丢失!只需添加\usepackage{times}
上面的 MWE,引号就会再次消失。
因此要注意两点:不要使用,\usepackage{times}
并确保在使用和编译时将其放在后面。language = Matlab,
我怀疑这两件事在使用选项时会导致与tex4ht相同的基本编码问题。basicstyle= \mlttfamily
make4ht
--lua
--lua
软件包冲突和选项冲突太多了。跟踪所有这些事情简直是一场噩梦。