草庐IT

用 Markdown 快速生成漂亮的 Latex 伪代码

山登绝顶我为峰 3(^v^)3 2023-04-22 原文

参考:在 Markdown 中书写伪代码

文章目录

配置 VSCode

组合: VSCode + Markdown Preview Enhanced + pseudocode.js

  1. 安装好 VSCodeMarkdown Preview Enhanced 插件

  2. 按下快捷键 Ctrl + Shift + P,打开 VSCode 命令窗口,输入 Markdown Preview Enhanced: Extend Parser 命令并回车运行

  3. 下面的配置,覆盖原始 .js 文件:

    // 原始配置
    /*
    module.exports = {
      onWillParseMarkdown: function(markdown) {
        return new Promise((resolve, reject)=> {
          return resolve(markdown)
        })
      },
      onDidParseMarkdown: function(html, {cheerio}) {
        return new Promise((resolve, reject)=> {
          return resolve(html)
        })
      },
      onWillTransformMarkdown: function (markdown) {
            return new Promise((resolve, reject) => {
                return resolve(markdown);
            });
        },
      onDidTransformMarkdown: function (markdown) {
          return new Promise((resolve, reject) => {
              return resolve(markdown);
          });
      }
    }
    */
    
    // Latex 魔改
    module.exports = {
      onWillParseMarkdown: function(markdown) {
        return new Promise((resolve, reject)=> {
          return resolve(markdown)
        })
      },
      onDidParseMarkdown: function(html, {cheerio}) {
        return new Promise((resolve, reject)=> {
          return resolve(`
    <script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.js"
        integrity="sha256-F/Xda58SPdcUCr+xhSGz9MA2zQBPb0ASEYKohl8UCHc=" crossorigin="anonymous">
    </script> 
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/pseudocode@latest/build/pseudocode.min.css">
    <script src="https://cdn.jsdelivr.net/npm/pseudocode@latest/build/pseudocode.min.js">
    </script>
    ` + html + `
    <script>
    elements = document.getElementsByClassName("pseudocode");
    for (var i = 1; i <= elements.length; i++) {
        setTimeout(function() {
            var element = document.getElementsByClassName("pseudocode")[0];
            pseudocode.renderElement(element, { lineNumber: element.getAttribute("lineNumber") == "true" });
        }, i * 100);
    }
    </script>`)
        })
      },
      onWillTransformMarkdown: function (markdown) {
            return new Promise((resolve, reject) => {
                return resolve(markdown);
            });
        },
      onDidTransformMarkdown: function (markdown) {
          return new Promise((resolve, reject) => {
              return resolve(markdown);
          });
      }
    }
    

编写 Latex 源码

下面给出一个 markdown 模板:

<H1 align="center">标题居中</H1>

<H1>目录</H1>
@[toc]
此位置之后 pdf 换页
<div STYLE=" page-break-after: always;"> 
	<!-- 换页符 --> 
</div>



# KD-Tree

## 构建

KD-Tree 的构建算法如下:
1. 首先,计算数据集 $Data$ 各个维度的方差,选择方差最大的坐标轴作为枢轴 $pivot$
2. 然后,计算数据集在枢轴上的中位数 $med$,作为数据集的划分标准
3. 所有枢轴坐标不大于 $med$ 的样本收集到子集合 $L$ 里,所有枢轴坐标大于 $med$ 的样本收集到子集合 $R$ 里
4. 递归构建左右子树,直到子集合大小不超过某个阈值 $T$

<pre class="pseudocode" lineNumber="true">
\begin{algorithm}
\caption{构建 KD-Tree}
\begin{algorithmic}
\STATE \textbf{输入}:集合 $Data = \{x_1,x_2,\cdots,x_n\}$,叶子阈值 $T$
\STATE \textbf{输出}:树根 $root$
\PROCEDURE{KDTree}{$Data,T$}
	\IF{$n \le T$}
		\STATE $root.data := Data$
		\STATE $root.isleaf := 1$
		\RETURN $root$
	\ENDIF
	\STATE // 选择方差最大的坐标轴作为枢轴,划分数据集
	\STATE $root.pivot := \argmax_{1 \le j \le D} variance(Data,j)$
	\STATE $root.med := medain(Data,r)$
	\STATE $L,R := \empty$
	\FOR{$i:=1$ \TO $n$}
		\IF{$x_i[root.pivot] \le root.med$}
			\STATE $L := L \cup \{x_i\}$
		\ELSE
			\STATE $R := R \cup \{x_i\}$
		\ENDIF
	\ENDFOR
	\STATE // 递归构建左右子树
	\STATE $root.left :=$ \CALL{KDTree}{$L,T$}
	\STATE $root.right :=$ \CALL{KDTree}{$R,T$}
	\STATE $root.isleaf := 0$
	\RETURN $root$
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
</pre>



## 最近邻

在 KD-Tree 上查找给定数据的最近邻,算法如下:
1. 从根节点开始,数据与枢轴上的中值比较,进入 $L, R$ 子集合。递归,直到进入某个叶子节点
2. 计算数据与节点上数据的最小距离点,计算距离 $d_1$
3. 然后回溯到父节点,计算与枢轴中值的距离 $d_2$
4. 如果 $d_1<d_2$,那么已经找到了最近邻;否则还要继续进入兄弟节点,以查找可能存在的更近点,然后继续回溯,直到满足 $d_1<d_2$


<pre class="pseudocode" lineNumber="true">
\begin{algorithm}
\caption{在 KD-Tree 上查找最近邻}
\begin{algorithmic}
\STATE \textbf{输入}:数据 $x$,树根 $root$
\STATE \textbf{输出}:最近邻 $y$
\PROCEDURE{FindNearest}{$x,root$}
	\IF{$root.isleaf = 1$}
		\RETURN $y := \argmin_{i \in root.data} dist(x,i)$
	\ENDIF
	\STATE // 递归查找最近邻,找到可能值之后回溯
	\IF{$x[root.pivot] \le root.med$}
		\STATE $tag := 0$
		\STATE $y :=$ \CALL{FindNearest}{$x,root.left$}
	\ELSE
		\STATE $tag := 1$
		\STATE $y :=$ \CALL{FindNearest}{$x,root.right$}
	\ENDIF
	\STATE $d_1 := dist(x,y)$
	\STATE $d_2 := |x[root.pivot]-root.med|$
	\STATE // 判断是否已经获得最近邻
	\IF{$d_1 > d_2$}
		\IF{$tag = 0$}
			\STATE $z :=$  \CALL{FindNearest}{$x,root.right$}
		\ELSE
			\STATE $z :=$  \CALL{FindNearest}{$x,root.left$}
		\ENDIF 
		\STATE $y := \argmin_{i=y,z} dist(x,i)$
	\ENDIF
	\RETURN $y$
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
</pre>



## 添加数据

在已有的数据集上构建好 KD-Tree 之后,我们可能还有加入新样本的需求。新样本的加入规则很简单,只需找出这个样本所属于的区域(某个叶子节点),然后把新样本添加到这个区域内即可。

KD-Tree 的数据添加算法如下:
1. 从根节点开始,数据与枢轴上的中值比较,进入 $L, R$ 子集合。递归,直到进入某个叶子节点
2. 如果添加新数据后,叶子节点中包含的集合大小超过阈值 $T$,那么就把叶子集合按照 KD-Tree 构建算法,分割为多个节点


<pre class="pseudocode" lineNumber="true">
\begin{algorithm}
\caption{在 KD-Tree 上添加新数据}
\begin{algorithmic}
\STATE \textbf{输入}:新数据 $x$,树根 $root$,叶子阈值 $T$
\STATE \textbf{输出}:树根 $root$
\PROCEDURE{AddData}{$x,root,T$}
	\IF{$root.isleaf = 1$}
		\STATE // 判断是否需要分裂
		\IF{$|root.data| \ge T$}
			\STATE $root :=$ \CALL{KDTree}{$root.data \cup \{x\}$}
		\ELSE
			\STATE $root.data := root.data \cup \{x\}$
		\ENDIF
		\RETURN $root$
	\ENDIF
	\STATE // 递归进入左右子树
	\IF{$x[root.pivot] \le root.med$}
		\STATE \CALL{AddData}{$x,root.left,T$}
	\ELSE
		\STATE \CALL{AddData}{$x,root.right,T$}
	\ENDIF
	\RETURN $root$
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
</pre>


生成 pseudocode

  1. 使用 VSCode 打开上面的 markdown 文件:

  1. 右击,出现快捷栏:

  1. 可以用 Chrome 直接打印 PDF(个人感觉,打印的比其他选项都漂亮)
  2. 也可以使用 Edge 浏览器打开,找到 网页捕获 工具

  1. 这个工具可以实现长截图(用于伪代码很长的情况,但清晰度不好)

  1. 如果想要清晰的截图,还是使用 Windows 系统自带的截图工具比较好

有关用 Markdown 快速生成漂亮的 Latex 伪代码的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐