我正在尝试在 LaTeX 中包含 Mathematica 代码。为了获得 Mathematica 代码,我刚刚将笔记本导出为 PDF。我不喜欢它包含在我的 TEX 代码中的方式,所以我只是想在图片周围添加一个框,以使其更花哨一些。它还没有出现,但总比没有好。使用的代码是
\documentclass[a4paper,11pt]{article}
\usepackage{kerkis}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsthm}
\usepackage[pdftex]{graphicx}
\usepackage{xcolor}
\begin{document}
\begin{align}
\nonumber W_{r\rightarrow\infty}=&-\int_{r}^{\infty}\!F\,\mathrm{d}y=- \int_r^\infty \! \dfrac{1}{4\pi \epsilon_0} \dfrac{q^2}{\alpha^2} \dfrac{\alpha^3}{y^3}\left(1- \dfrac{\alpha^2} {y^2}\right)^{-2}\,\mathrm{d}y\\
=&-\dfrac{1}{4\pi \epsilon_0} \dfrac{q^2}{\alpha^2}\alpha^3 \underbrace{\int_r^\infty \! y^{-3} \left(1-\dfrac{\alpha^2} {y^2}\right)^{-2} \,\mathrm{d}y}_{I} \label{eq:WcondI}
\end{align}
\setlength{\unitlength}{1cm}
\begin{picture}(15,5)
\color{blue}
\put(-1,0){\line(0,1){5}}
\put(0,1.5){\includegraphics[scale=0.8]{math}}
\put(-1,0){\line(1,0){15}}
\put(14,0){\line(0,1){5}}
\put(-1,5){\line(1,0){15}}
\end{picture}
\end{document}
我的输出是
关于如何以更美观的方式包含 Mathematica 代码有什么想法吗?
编辑:起初我使用包listing
,但问题是分数,而且我不知道如何以方便的方式包含In[1]
,Out[1]
答案1
我知道这个问题已经很老了,OP肯定不再需要它了,但最近我遇到了类似的问题,我认为我的解决方案回答了这个问题。
首先要注意的是,在 Mathematica FrontEnd 中,单元格可以具有任意样式。每种样式的外观都可以通过样式表进行自定义。使用默认样式表,即使是最基本的单元格样式也会Input
看起来Output
不同。
Input
在具有某些样式(例如或)的单元格中,Code
代码语法是彩色的,这可以使用其他答案listings
包中已经提到的来实现。
具有某些样式(例如Input
、Output
或Print
)的单元格默认使用所谓的StandardForm
,它允许在代码中嵌入复杂的格式(分数、上标等)。其他答案通过使用包mathescape
的功能部分解决了这个listings
问题。此解决方案的问题是mathescape
“完全转义”为 TeX。由于无法嵌套listings
环境/命令,我看不出有办法仅使用 再次将转义内容的部分视为代码(例如逐字排版)listings
。
为了实现这样的功能,可以使用包Verbatim
中的环境fancyvrb
。通过设置适当的环境commandchars
,我们可以\frac
在代码中嵌入命令,这样 frac 的参数就可以逐字排版。缺点fancyvrb
是它不提供自动语法着色。幸运的是,listings
有一个特殊的接口fancyvrb
,允许结合使用读取代码fancyvrb
和排版listings
。
下面我介绍我的细胞包,它基于fancyvrb
+listings
方法实现解决方案,并具有一些附加功能,如可自定义的单元格样式、自动单元格标签等。
还有相应的数学包裹:单元格转TeX,自动导出数学代码转换为与 TeX 代码兼容的mmacells
。数学软件包的详细描述见回答“如何最好地将各种细胞组嵌入到乳胶项目中?”问题
在 Mathematica Stack Exchange 上。
使用示例
TeX 代码:
\documentclass{article}
\usepackage[margin=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mmacells}
\mmaDefineMathReplacement[≤]{<=}{\leq}
\mmaDefineMathReplacement[≥]{>=}{\geq}
\mmaDefineMathReplacement[≠]{!=}{\neq}
\mmaDefineMathReplacement[→]{->}{\to}[2]
\mmaDefineMathReplacement[⧴]{:>}{:\hspace{-.2em}\to}[2]
\mmaDefineMathReplacement{∉}{\notin}
\mmaDefineMathReplacement{∞}{\infty}
\mmaDefineMathReplacement{
答案2
您可以listings
一起使用来xcolor
包含代码,例如使用此 MWE
\documentclass[a4paper,12pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{listings,xcolor}
\lstset{language=Mathematica}
\lstset{basicstyle={\sffamily\footnotesize},
numbers=left,
numberstyle=\tiny\color{gray},
numbersep=5pt,
breaklines=true,
captionpos={t},
frame={lines},
rulecolor=\color{black},
framerule=0.5pt,
columns=flexible,
tabsize=2
}
\begin{document}
\begin{lstlisting}[language=Mathematica,caption={Example code}]
Integrate[{y^(-3)}*(1-(a/y)^2)^(-2),{y,r,Infinity}]
\end{lstlisting}
\end{document}
你会得到类似
甚至通过更改颜色来\lstset
调整颜色,使其看起来更加Mathematica
美观。然后,您还可以使用外部代码文件和类似的东西\lstinputlisting{yourfile.m}
来包含它们。这是我更喜欢的,因为这样您就可以(在 Mathematica 中处理一个单元格)编写您想要的内容并更改代码。由于输入,它会自动成为代码示例的最新版本。
编辑1OP 要求在他的代码中使用数学符号和分数:
一种方法是将其添加mathescape
到 lstset 作为另一个键。然后$
在代码中的任何位置,模式都会切换到数学模式,然后只需键入数学即可。然后可以将代码行更改为
Integrate[{y^(-3)}*(1-$\bigl(\frac{a}{y}\bigr)$^2)^(-2),{y,r,Infinity}]
虽然
我认为它读起来并不那么好(因为^2
代码中仍然有其他非 LaTeX 设置的公式。最后,我上面的评论不再起作用了,这个代码当然不能再在 Mathematica 中运行了。
答案3
将 mathematica 包纳入 latex 的另一种方法是使用此包mma.sty
经过曼努埃尔·考尔斯。 和
\usepackage{mma}
在序言中,我们可以做很多事情。我觉得这真的很棒。我通常把它放在框架环境,我觉得很酷。见下图:
还有一些关于如何在样式文件中使用该包的示例mma.sty。
附录
根据@KevinO'Bryant 的要求,我添加了一个 MWE,它可以生成上面的两幅图像。
\documentclass[10pt,a4paper]{article}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{mma}
\newcommand{\bc}{\textcolor{blue}}
% For mathematica session
\mdfdefinestyle{mmabox}{%
innerlinewidth=0.5pt, innerleftmargin=10pt,%
innerrightmargin=10pt, innertopmargin=10pt,%
innerbottommargin=10pt, roundcorner=5pt,
singleextra={\path (P) -- node[minimum height=.6cm,overlay,draw,fill=white, rounded corners,very thick] {\bf Mathematica Session} (O|-P);}
}
\surroundwithmdframed[style=mmabox]{mma}
\begin{document}
\begin{mma}
\In |Command|[|arg|_1,1+1] \\
\Out \mathrm{x^2+9} \\
\In |quit| \\
\Warning{name} something in text mode \\
\In |Print|["test"];\\
\Print test\\
\In |Quit| \\
\Out {\rm
\{ \{-6,\ \sqrt{2},\ \sqrt{3},\ k,\ 1 + n \},\ \{ \{k + n,\ 2 + k + n,\ -2\},\ \{ k + n,\ 5 + k + n,\ -5 \},\ \{2 + k + n,\ 5 + k + n,\ -3 \} \} \}
} \\
\end{mma}
\begin{mma}
\In {\mathrm{\bf f = \{ \sqrt{2}(\bc{n}+1)^{2}(\bc{n}+\bc{k}),\ 6 (\bc{n}+1) (-\bc{k} - \bc{n} - 2) \bc{k},\ \sqrt{-3}(\bc{k} + \bc{n} + 5)\};}} \\
\In {\mathrm{\bf tower = \Big\{ \{\bc{k}, 1, 1 \},\ \Big\{\bc{h}, 1, \frac{1}{\bc{k} + 1} \Big\},\ \Big\{\bc{b}, \frac{\bc{n}-\bc{k}}{\bc{k}+1}, 0 \Big\} \Big\} ;}}\\
\In {\mathrm{\bf ShiftPrimeEquivalentFactors[f,\ tower]}}\\
\Out {
\mathrm{
\{ \{-6,\ \sqrt{2},\ \sqrt{3},\ k,\ 1 + n \},\ \{ \{k + n,\ 2 + k + n,\ -2\},\ \{ k + n,\ 5 + k + n,\ -5 \},\ \{2 + k + n,\ 5 + k + n,\ -3 \} \} \}
}
}\\
\end{mama}
\end{document}
答案4
使用该listings
包,可以在 mathematica 代码中获取数学模式。您需要mathescape
在环境定义中添加选项listings
,并手动将数学分隔符放置在列表中。我意识到如果您想插入大量代码,这可能不切实际。
我希望下面的代码能够清楚地表达我的意思。
\documentclass{article}
\usepackage{listings}
\usepackage{framed}
\usepackage{xcolor}
\usepackage{amsmath}
\colorlet{shadecolor}{gray!20}
\lstnewenvironment{mat}
{\lstset{language=mathematica,mathescape,columns=flexible}}
{}
\begin{document}
\begin{align}
\nonumber W_{r\rightarrow\infty}=&-\int_{r}^{\infty}\!F\,\mathrm{d}y=- \int_r^\infty \! \dfrac{1}{4\pi \epsilon_0} \dfrac{q^2}{\alpha^2} \dfrac{\alpha^3}{y^3}\left(1- \dfrac{\alpha^2} {y^2}\right)^{-2}\,\mathrm{d}y\\
=&-\dfrac{1}{4\pi \epsilon_0} \dfrac{q^2}{\alpha^2}\alpha^3 \underbrace{\int_r^\infty \! y^{-3} \left(1-\dfrac{\alpha^2} {y^2}\right)^{-2} \,\mathrm{d}y}_{I} \label{eq:WcondI}
\end{align}
\begin{shaded}
\begin{mat}
In[1]:= Integrate[{y^(-3)*(1-(a/y)^2)^(-2)},{y,r,Infinity}]
Out[1]= {ConditionalExpression[$\displaystyle-\frac{1}{2(a^2-r^2)}$, Im[r]
Re[a] $\neq$ Im[a] Re[r] || (( $a+r>0$ || $a+r \notin $ Reals) && ($a<r$ ||
$a-r \notin$ Reals) || $r\notin$ Reals )]}
\end{mat}
\end{shaded}
\end{document}
请注意,我手动格式化了输出。结果如下: