有没有支持 Markdown 的软件包?

有没有支持 Markdown 的软件包?

有时,我不希望将注释的所有部分都转换为 Tex 格式。我通常会将这些上下文放在逐字。但是,这是一种相当粗糙的方法。所以我开始想知道你是否可以在 Tex 中使用 Markdown。我最初是受到 Hamilton 的启发代码在他发布他的软件包之后,他在 Tex 中使用了 R。

我不想转换为 Tex 的虚拟数据示例:

% http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3458956/
ABC
\textbf{All here are antiseptics} % (used in living tissues on mucosa)
% Antiseptic is often disinfection
1 Iodum (Iodine)
2 Povidonum iodinatum
3 Ichthammolum (ammonia)
4 Viride nitens
5 Kalii permanganas (potassium permanganate)
6 Hydrogeniii peroxidum
7 Benzoylis peroxidum
8 Nitrofuralum
9 Acidum boricum
10 Sulfadiazinum argentum (silver sulfadiazine)
11 Benzalkonium
12 Propanolum/Benzalconium
13 Chlorhexidium
14 Cetylpyridinium
15 Dequalinium/Cinchocainum
16 Colini salicylas (salt of salicylic acid - colini adds here saliva production)
17 Hexetidinum (hexetidine)

% only 120 main drugs in exam - from 6 classes theoretically
% much more studied in practcals

A group
1 Halogen
2 Halogen
3 Aromatic compound
4 Dye compounds
5 Oxidizing agent
6 Oxidizing agent
7 Oxidizing agent
8 Nitrofurans
9 Acids 
10 Heavy metal (silver)
% Synthetic antibacterial
% Antibiotics are produced by living organisms (fungi, bacteria, actinomyces, ...)
...

操作系统:Debian 8.5
Linux 内核:4.6 反向移植
硬件:Asus Zenbook UX303UA
TeXLive:最新版本,不是 apt-get 中的旧版本

答案1

一个新的包用于将 Markdown 包含在纯 TeX、LaTeX 和 ConTeXt 文档中。与 Michal 在已接受答案中建议的软件包非常相似,此软件包也基于 Lunamark 解析器。这一次,解析器经过了大量修改,以便允许用户控制 Markdown 标记到 TeX 标记的扩展:

\documentclass{article}
\usepackage{markdown}
\markdownSetup{
  renderers = {
    link     = {#1},        % Render a link as the link label.
    emphasis = {\emph{#1}}, % Render emphasis using `\emph`.
  }
}
\begin{document}
\begin{markdown}
  _Hello,_ [Stack Exchange](http://tex.stackexchange.com)!
\end{markdown}
\end{document}

上述代码生成“你好,Stack Exchange!”。请注意,设置这些映射不是强制性的(尽管通常很有用);默认值应该相当合理。鼓励包作者重新定义渲染器原型(参见包装文档)覆盖默认值而不覆盖用户映射。

任何支持 shell 访问的引擎(pdfTeX、XeTeX)都可以使用,而不仅仅是 LuaTeX。但请注意,当你不使用 LuaTeX 时,你需要在文件中提供--shell-escape选项或设置。这与其他软件包(例如 Geoffrey M. Poore 的shell_escape=ttexmf.cnfminted) 需要 shell 访问。

该包还支持语法扩展,如引用、隔离代码块等(参见包装文档),尽管我确实将它们移植到了 Lunamark,所以现在它们也可以与 Michal 的包一起使用。

答案2

编辑

我把这段代码放在了 github 上 -乳胶标记,并稍微延伸了一点。

提供了新的封装选项:

扩展:选择 lunamark 扩展

文档:处理整个过程\begin{document} ... \end{document}

模板: 选择科斯莫用于打印转换后的文本的模板

添加了新命令:

\markdownfile{filename}

排版 markdown 文件。


可以使用lunamarkLuaTeX但安装起来有点困难。您需要在本地 texmf 树(通常是 ~/texmf/scripts/lua,您可能需要创建此目录)中添加新目录,并从中复制目录lunamark内容standalone/srclunamark 来源

测试该命令是否有效:

kpsewhich lunamark.lua

应该打印该文件的路径。

安装成功后,我们可以创建简单的lua模块进行lunamark加载,latexmark.lua

local latexmark = {}
local lunamark = require("lunamark")
local writer = lunamark.writer.latex.new()
local util = lunamark.util
writer.string = function(s) return s end
writer.definitionlist= function(items)
    local buffer = {}
    for _,item in ipairs(items) do
      local defs = {}
      buffer[#buffer + 1] = {"\\item[",item.term,"] ", util.intersperse(item.definitions,"\n")}
    end
    local contents = util.intersperse(buffer, "\n")
    return {"\\begin{description}\n",contents,"\n\\end{description}"}
 end
latexmark.init = function(extensions)
   local extensions = extensions or { smart = true, definition_lists=true}
   latexmark.parser = lunamark.reader.markdown.new(writer, extensions)
end

latexmark.end_env = "%s*\\end{latexmark}"
local buffer = {}
latexmark.callback = function(buf)
  if buf:match(latexmark.end_env) then
    --local ret =  latexmark.process() 
    --table.insert(ret, buf)
    return ret
  end
  buffer[#buffer+1] = buf
  return ''
end

latexmark.process = function()
  local result = latexmark.parser(table.concat(buffer,"\n"))
  buffer = {}
  local lines = string.explode(result,"\n")
  for _, line in ipairs(lines) do
    print(line)
    tex.print(line)
  end
  return lines
end

return latexmark

lunamark正在初始化并process_input_filter提供 LuaTeX 的功能。现在是一些简单的 LaTeX 包,latexmark.sty

\ProvidesPackage{latexmark}

\RequirePackage{luatexbase}

\directlua{%
  latexmark = require "latexmark"
  latexmark.init()
}


\newenvironment{latexmark}
{\directlua{luatexbase.add_to_callback("process_input_buffer",latexmark.callback,"latexmark")}}
{\directlua{%
    luatexbase.remove_from_callback("process_input_buffer", "latexmark")
    latexmark.process()
}}

\endinput

提供新的环境latexmark,其内容将被转换。它真的很容易使用:

\documentclass{article}
\usepackage{fontspec}
\usepackage{latexmark}
\begin{document}

\begin{latexmark}
# Hello world

1. enumerated
2. list

some \LaTeX\ stuff: $a = \sqrt{b}$

what
: it is easy to provide description lists

and also `monospaced`, or *emphatized* texts

\end{latexmark}
\end{document}

在此处输入图片描述

一些示例文件:

相关内容