使用示例

使用示例

我正在尝试在 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包中已经提到的来实现。

具有某些样式(例如InputOutputPrint)的单元格默认使用所谓的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 上。

使用示例

结果打印屏幕: Mathematica 单元格(pdf 格式)

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} 

在序言中,我们可以做很多事情。我觉得这真的很棒。我通常把它放在框架环境,我觉得很酷。见下图:

MathematicaCodeInLaTeX

还有一些关于如何在样式文件中使用该包的示例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}

请注意,我手动格式化了输出。结果如下: 结果

相关内容