diff --git a/anu-comp2310-assignment1/index.html b/anu-comp2310-assignment1/index.html index 592e434..5bbd9bc 100644 --- a/anu-comp2310-assignment1/index.html +++ b/anu-comp2310-assignment1/index.html @@ -157,7 +157,7 @@

前言

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

问题

-

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量球的信息(加速度,速度,位置),并且加满能量,而当靠近的时候,能够互相交换一次信息,这个信息的内容是自己定义的。在能量耗尽后就消失了,而我们需要做的就是在一定的时间内,保证尽可能多的存活。

+

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量球的信息(加速度,速度,位置),并且加满能量,而当靠近的时候,能够互相交换一次信息,这个信息的内容是自己定义的。在能量耗尽后就消失了,而我们需要做的就是在一定的时间内,保证尽可能多的存活。

分析

其实这个问题最关键的地方在于,没有一个中央的控制节点,也就是说对于每一个来说都是完全平等且独立的。所以我们需要他们能够尽可能的一直处在能够交流的状态,并且都能知道能量球在哪里。

diff --git a/categories/Internship/index.html b/categories/Internship/index.html index d0ead36..6ffe2f7 100644 --- a/categories/Internship/index.html +++ b/categories/Internship/index.html @@ -130,7 +130,7 @@ animation-duration: 2.8s; background-image: radial-gradient(ellipse closest-side, rgba(0, 0, 0, 0.56), #100e17), - url(//davidz.cn/static/blog/2020-02-11-inspur-ip-guard-uninstallation/cover.svg);"> + url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);"> @@ -206,7 +206,7 @@
+ url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

diff --git a/categories/Study/index.html b/categories/Study/index.html index 9ddb106..a442b4a 100644 --- a/categories/Study/index.html +++ b/categories/Study/index.html @@ -176,7 +176,7 @@

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

-

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量...

+

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量...

查看全文 diff --git a/index.html b/index.html index ea5b95d..d307363 100644 --- a/index.html +++ b/index.html @@ -468,7 +468,7 @@ cos\theta & sin\theta \\
+ url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

diff --git a/inspur-internship/index.html b/inspur-internship/index.html index 9f82695..7a8d35c 100644 --- a/inspur-internship/index.html +++ b/inspur-internship/index.html @@ -87,7 +87,7 @@ animation-duration: 1.2s; background-image: radial-gradient(ellipse closest-side, rgba(0, 0, 0, 0.65), #100e17), - url(//davidz.cn/static/blog/2020-01-27-inspur-internship/cover.jpg) "> + url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg) ">

diff --git a/inspur-ip-guard-uninstallation/index.html b/inspur-ip-guard-uninstallation/index.html index c97f1a1..e4dbb24 100644 --- a/inspur-ip-guard-uninstallation/index.html +++ b/inspur-ip-guard-uninstallation/index.html @@ -89,7 +89,7 @@ animation-duration: 1.2s; background-image: radial-gradient(ellipse closest-side, rgba(0, 0, 0, 0.65), #100e17), - url(//davidz.cn/static/blog/2020-02-11-inspur-ip-guard-uninstallation/cover.svg) "> + url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg) ">

diff --git a/page/2/index.html b/page/2/index.html index 8c43f53..17a05cc 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -130,7 +130,7 @@ animation-duration: 2.8s; background-image: radial-gradient(ellipse closest-side, rgba(0, 0, 0, 0.56), #100e17), - url(//davidz.cn/static/blog/2020-01-27-inspur-internship/cover.jpg);"> + url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

@@ -202,7 +202,7 @@
+ url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

@@ -300,7 +300,7 @@

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

-

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有...

+

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有...

查看全文
diff --git a/search.xml b/search.xml index e2a9ddf..a93b5bf 100644 --- a/search.xml +++ b/search.xml @@ -127,7 +127,7 @@ /write-latex-report-with-markdown/ -

原创发表于 DavidZ Blog,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。

前言

计算机这个专业,有很多报告要做。在山威的时候,报告格式没有什么限制 Word,PDF 都可以,那个时候我开始使用 Markdown 作为我的排版工具,因为实在是没有时间经历去研究 Word 的各种高级功能(主要是懒)。Markdown 十分简单,易学,在Github等计算机专业相关平台使用也非常广泛,还可以通过各种模板快速生成好看美观专业的文档。

后来到了澳国立,老师教授们开始极力鼓吹 Latex 和 PDF,基本上算是软性要求我们使用 Latex 编写,还规定了衬线字体,非衬线字体,字号,段落等等,图片还需要是 SVG 格式的矢量图片(最奇葩的是竟然一整节课只讲这个😂),最后生成 PDF 提交(据说这样分数高一些)。所以我开始了漫漫 Latex 学习之路。然而整个过程十分痛苦,装个 TeX Live 跑了好几个小时,换个字体换的我一脸懵逼,预览竟然都不是实时的!!!我甚至觉得还不如 Word 好用,又开始找那些 Latex 编辑器(同学的 MacOS 上有很不错的,然而我是 Windows),之后是在线编辑器Overleaf,体验还行,但是一边学习 Latex 一边做实验写报告的体验实在是太差劲了,人都要有丝分裂了。我就先用 Markdown 记录下来,想着之后再改成 Latex 吧。然后,我用了 2 天左右的时间,找到了 Markdown 直接转报告的方法,就没再碰 Latex(还是懒)。

样例

eisvogel 主题样例

你也可以从这里看一下我的成果作为参考,我觉得完全符合我的要求。

思路

其实思路很简单,一切的一切都是因为Pandoc这个文档转换软件软件(类似于影音界的格式工厂?)的存在。它官网有一张巨型图片描述了它可以从那些格式转换成那些格式,基本上可以说覆盖了常见的所有文档格式。所以我们就可以用它把 Markown 语言写的文档转换成 PDF 格式的报告,过程中再用一套模板修饰一下就好啦。

注意
Pandoc 通过 Markdown -> Latex -> PDF 的方式得到 PDF,中间文件是 Latex

准备

Markdown 语法

注意
Markdown 实际上和 HTML 是“近亲”,你甚至可以直接使用 HTML 标签。

这个百度或者谷歌一下,很容易找到教程,学起来也很简单,10 分钟上手,1 天熟练。

Markdown 编辑器

下面这俩我都有,看心情切换😄。

选项 1: VSCode

VSCode with Markdown Preview Enhanced

微软出品,宇宙最强 IDE Visual Studio 的“弟弟”,宇宙最强编辑器。

官网|Github下载安装包,双击安装即可。

虽然 VSCode 原生支持 Markdown,但是下面这几个属于增强型插件:

  1. Markdown Preview Enhanced,增强 Markdown 的预览效果,比如支持公式,清单之类的。
  2. Code Spell Checker,检查你报告里的拼写错误(不过好像只支持英文)。
  3. Markdownlint,检查 Markdown 的语法规范(强迫症专属)。
  4. Prettier,格式化 Markdown 代码(强迫症专属)。

选项 2: Typora

Typora

写作体验一级棒👍。

官网下载安装包,双击安装即可。

Latex Engine

注意
Latex 是个语言规范,Latex Engine 是它的实现,下面这俩都是 Latex Engine 的集合

因为 Scoop 里面只有 MiKTeX,所以我选择 MiKTeX。反正我只是写个报告,选哪个应该都无所谓吧。

选项 1: MiKTeX

通过 Scoop 安装:

scoop install latex

或者官网下载安装。

选项 2: TeX Live

官网下载安装。

Pandoc

Pandoc 主程序

这个就是前文所说的万能文档格式转换器软件了。

通过 Scoop 安装:

scoop install pandoc

或者官网下载安装。

Pandoc Filter

Pandoc 支持自定义过滤器,类似于插件,支持 Lua, Haskell, Python(对于想要自己尝试开发的同学,强烈推荐Panflute,比官方的pandocfilters更人性化一些)。

原理
INPUT --> reader --> AST --> filter --> AST --> writer --> OUTPUT
例子

上调所有小于 6 的标题的级别,如果大于 6,则删除标题(把标题变成段落)。

from panflute import *def increase_header_level(elem, doc):    if type(elem) == Header:        if elem.level < 6:            elem.level += 1        else:            return [] #  Delete headers already in level 6def main(doc=None):    return run_filter(increase_header_level, doc=doc)if __name__ == "__main__":    main()

然后在 Pandoc 的命令中用--filter指定这个 Python 文件即可。

推荐

用于 Pandoc 中的交叉引用,图片,公式,章节等,这个我也是用 Scoop 安装的,没有 Scoop 的话看看安装教程吧。

类型标识引用
图片![Caption](file.ext){#fig:label}@fig:label
公式$$ math $$ {#eq:label}@eq:label
表格: Caption {#tbl:label}@tbl:label
段落# Section {#sec:label}@sec:label
代码块: Listing caption {#lst:label}@lst:label

用于 Pandoc 中的文献引用,这个是自带的,无需安装。

需要指定 BibTeX(.bib) 文件来指定你的参考源,长这个样子,

@article{vinyals_show_2015,title = {Show and Tell: A Neural Image Caption Generator},url = {http://arxiv.org/abs/1411.4555},shorttitle = {Show and Tell},abstract = {Automatically describing the content of an image is a fundamental problem in artificial intelligence that connects computer vision and natural language processing. In this paper, we present a generative model based on a deep recurrent architecture that combines recent advances in computer vision and machine translation and that can be used to generate natural sentences describing an image. The model is trained to maximize the likelihood of the target description sentence given the training image. Experiments on several datasets show the accuracy of the model and the fluency of the language it learns solely from image descriptions. Our model is often quite accurate, which we verify both qualitatively and quantitatively. For instance, while the current state-of-the-art {BLEU}-1 score (the higher the better) on the Pascal dataset is 25, our approach yields 59, to be compared to human performance around 69. We also show {BLEU}-1 score improvements on Flickr30k, from 56 to 66, and on {SBU}, from 19 to 28. Lastly, on the newly released {COCO} dataset, we achieve a {BLEU}-4 of 27.7, which is the current state-of-the-art.},journaltitle = {{arXiv}:1411.4555 [cs]},author = {Vinyals, Oriol and Toshev, Alexander and Bengio, Samy and Erhan, Dumitru},urldate = {2020-06-01},date = {2015-04-20},langid = {english},eprinttype = {arxiv},eprint = {1411.4555},keywords = {Computer Science - Computer Vision and Pattern Recognition}}

以及 Citation Style Language(.csl)文件来指定你想要的引用格式,比如 APA,MLA,Chicago,Harvard 或者国内常用的 GB7714-2005,可以从citation-style-language/styles下载。

在文中用[@vinyals_show_2015]对应引用源即可实现引用自动生成,十分方便。

Pandoc Theme: Eisvogel 主题

Eisvogel

这个是我找到的计算机专业风格的论文/报告/书籍/幻灯片的开源模板,对于我来说是真的很合适了,美观,简约又专业。

Github Release下载,放到指定路径,就完了,很简单。

配置

---# Pandoctitle: Title of the Reportauthor: Jiahao Zhangdate: Jul. 3, 1998block-headings: truedocumentclass: articlepapersize: a4geometry: margin=2.5cmmainfont: Calibrisansfont: Calibrimonofont: JetBrains MonoCJKmainfont: Microsoft YaHeifontsize: 10ptlistings: truetoc: truetoc-depth: 2secnumdepth: 4bibliography: [resources.bib]csl: ieee.csl# Eisvogeltitlepage: trueheader-right: Reportfooter-left: Australian National Universitytoc-own-page: truetable-use-row-colors: falselistings-no-page-break: falsecode-block-font-size: \normalsize# CrossrefsubfigGrid: trueautoSectionLabels: true# Citeproclink-citations: truereference-section-title: References---

在每个 Markdown 文件最上面形如上面 YAML 代码的叫做YAML Front Matter,可以理解为对全文的配置。这里主要是一些对Pandoc,Eisvogel, CrossrefCiteproc的配置。

生成

运行下面的命令就可以生成 PDF 啦😄。

pandoc Report.md `-o Report.pdf `--standalone `--listings `--number-sections `--filter pandoc-crossref `--filter=pandoc-citeproc `--pdf-engine=xelatex `--template eisvogel

简单解释一下,

想法

完整的捣鼓下来其实也和学习 Latex 难度差不多了,但是配置完了这一套,只要要求不变,我再写报告的速度会加快很多很多,因为我只需要专注的写 Markdown 就好了😄。

PS: 这个博客所有的文章就是使用 Markdown 编写的。

]]> +

原创发表于 DavidZ Blog,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。

前言

计算机这个专业,有很多报告要做。在山威的时候,报告格式没有什么限制 Word,PDF 都可以,那个时候我开始使用 Markdown 作为我的排版工具,因为实在是没有时间经历去研究 Word 的各种高级功能(主要是懒)。Markdown 十分简单,易学,在Github等计算机专业相关平台使用也非常广泛,还可以通过各种模板快速生成好看美观专业的文档。

后来到了澳国立,老师教授们开始极力鼓吹 Latex 和 PDF,基本上算是软性要求我们使用 Latex 编写,还规定了衬线字体,非衬线字体,字号,段落等等,图片还需要是 SVG 格式的矢量图片(最奇葩的是竟然一整节课只讲这个😂),最后生成 PDF 提交(据说这样分数高一些)。所以我开始了漫漫 Latex 学习之路。然而整个过程十分痛苦,装个 TeX Live 跑了好几个小时,换个字体换的我一脸懵逼,预览竟然都不是实时的!!!我甚至觉得还不如 Word 好用,又开始找那些 Latex 编辑器(同学的 MacOS 上有很不错的,然而我是 Windows),之后是在线编辑器Overleaf,体验还行,但是一边学习 Latex 一边做实验写报告的体验实在是太差劲了,人都要有丝分裂了。我就先用 Markdown 记录下来,想着之后再改成 Latex 吧。然后,我用了 2 天左右的时间,找到了 Markdown 直接转报告的方法,就没再碰 Latex(还是懒)。

样例

eisvogel 主题样例

你也可以从这里看一下我的成果作为参考,我觉得完全符合我的要求。

思路

其实思路很简单,一切的一切都是因为Pandoc这个文档转换软件软件(类似于影音界的格式工厂?)的存在。它官网有一张巨型图片描述了它可以从那些格式转换成那些格式,基本上可以说覆盖了常见的所有文档格式。所以我们就可以用它把 Markown 语言写的文档转换成 PDF 格式的报告,过程中再用一套模板修饰一下就好啦。

注意
Pandoc 通过 Markdown -> Latex -> PDF 的方式得到 PDF,中间文件是 Latex

准备

Markdown 语法

注意
Markdown 实际上和 HTML 是“近亲”,你甚至可以直接使用 HTML 标签。

这个百度或者谷歌一下,很容易找到教程,学起来也很简单,10 分钟上手,1 天熟练。

Markdown 编辑器

下面这俩我都有,看心情切换😄。

选项 1: VSCode

VSCode with Markdown Preview Enhanced

微软出品,宇宙最强 IDE Visual Studio 的“弟弟”,宇宙最强编辑器。

官网|Github下载安装包,双击安装即可。

虽然 VSCode 原生支持 Markdown,但是下面这几个属于增强型插件:

  1. Markdown Preview Enhanced,增强 Markdown 的预览效果,比如支持公式,清单之类的。
  2. Code Spell Checker,检查你报告里的拼写错误(不过好像只支持英文)。
  3. Markdownlint,检查 Markdown 的语法规范(强迫症专属)。
  4. Prettier,格式化 Markdown 代码(强迫症专属)。

选项 2: Typora

Typora

写作体验一级棒👍。

官网下载安装包,双击安装即可。

Latex Engine

注意
Latex 是个语言规范,Latex Engine 是它的实现,下面这俩都是 Latex Engine 的集合

因为 Scoop 里面只有 MiKTeX,所以我选择 MiKTeX。反正我只是写个报告,选哪个应该都无所谓吧。

选项 1: MiKTeX

通过 Scoop 安装:

scoop install latex

或者官网下载安装。

选项 2: TeX Live

官网下载安装。

Pandoc

Pandoc 主程序

这个就是前文所说的万能文档格式转换器软件了。

通过 Scoop 安装:

scoop install pandoc

或者官网下载安装。

Pandoc Filter

Pandoc 支持自定义过滤器,类似于插件,支持 Lua, Haskell, Python(对于想要自己尝试开发的同学,强烈推荐Panflute,比官方的pandocfilters更人性化一些)。

原理
INPUT --> reader --> AST --> filter --> AST --> writer --> OUTPUT
例子

上调所有小于 6 的标题的级别,如果大于 6,则删除标题(把标题变成段落)。

from panflute import *def increase_header_level(elem, doc):    if type(elem) == Header:        if elem.level < 6:            elem.level += 1        else:            return [] #  Delete headers already in level 6def main(doc=None):    return run_filter(increase_header_level, doc=doc)if __name__ == "__main__":    main()

然后在 Pandoc 的命令中用--filter指定这个 Python 文件即可。

推荐

用于 Pandoc 中的交叉引用,图片,公式,章节等,这个我也是用 Scoop 安装的,没有 Scoop 的话看看安装教程吧。

类型标识引用
图片![Caption](file.ext){#fig:label}@fig:label
公式$$ math $$ {#eq:label}@eq:label
表格: Caption {#tbl:label}@tbl:label
段落# Section {#sec:label}@sec:label
代码块: Listing caption {#lst:label}@lst:label

用于 Pandoc 中的文献引用,这个是自带的,无需安装。

需要指定 BibTeX(.bib) 文件来指定你的参考源,长这个样子,

@article{vinyals_show_2015,title = {Show and Tell: A Neural Image Caption Generator},url = {http://arxiv.org/abs/1411.4555},shorttitle = {Show and Tell},abstract = {Automatically describing the content of an image is a fundamental problem in artificial intelligence that connects computer vision and natural language processing. In this paper, we present a generative model based on a deep recurrent architecture that combines recent advances in computer vision and machine translation and that can be used to generate natural sentences describing an image. The model is trained to maximize the likelihood of the target description sentence given the training image. Experiments on several datasets show the accuracy of the model and the fluency of the language it learns solely from image descriptions. Our model is often quite accurate, which we verify both qualitatively and quantitatively. For instance, while the current state-of-the-art {BLEU}-1 score (the higher the better) on the Pascal dataset is 25, our approach yields 59, to be compared to human performance around 69. We also show {BLEU}-1 score improvements on Flickr30k, from 56 to 66, and on {SBU}, from 19 to 28. Lastly, on the newly released {COCO} dataset, we achieve a {BLEU}-4 of 27.7, which is the current state-of-the-art.},journaltitle = {{arXiv}:1411.4555 [cs]},author = {Vinyals, Oriol and Toshev, Alexander and Bengio, Samy and Erhan, Dumitru},urldate = {2020-06-01},date = {2015-04-20},langid = {english},eprinttype = {arxiv},eprint = {1411.4555},keywords = {Computer Science - Computer Vision and Pattern Recognition}}

以及 Citation Style Language(.csl)文件来指定你想要的引用格式,比如 APA,MLA,Chicago,Harvard 或者国内常用的 GB7714-2005,可以从citation-style-language/styles下载。

在文中用[@vinyals_show_2015]对应引用源即可实现引用自动生成,十分方便。

Pandoc Theme: Eisvogel 主题

Eisvogel

这个是我找到的计算机专业风格的论文/报告/书籍/幻灯片的开源模板,对于我来说是真的很合适了,美观,简约又专业。

Github Release下载,放到指定路径,就完了,很简单。

配置

---# Pandoctitle: Title of the Reportauthor: Jiahao Zhangdate: Jul. 3, 1998block-headings: truedocumentclass: articlepapersize: a4geometry: margin=2.5cmmainfont: Calibrisansfont: Calibrimonofont: JetBrains MonoCJKmainfont: Microsoft YaHeifontsize: 10ptlistings: truetoc: truetoc-depth: 2secnumdepth: 4bibliography: [resources.bib]csl: ieee.csl# Eisvogeltitlepage: trueheader-right: Reportfooter-left: Australian National Universitytoc-own-page: truetable-use-row-colors: falselistings-no-page-break: falsecode-block-font-size: \normalsize# CrossrefsubfigGrid: trueautoSectionLabels: true# Citeproclink-citations: truereference-section-title: References---

在每个 Markdown 文件最上面形如上面 YAML 代码的叫做YAML Front Matter,可以理解为对全文的配置。这里主要是一些对Pandoc,Eisvogel, CrossrefCiteproc的配置。

生成

运行下面的命令就可以生成 PDF 啦😄。

pandoc Report.md `-o Report.pdf `--standalone `--listings `--number-sections `--filter pandoc-crossref `--filter=pandoc-citeproc `--pdf-engine=xelatex `--template eisvogel

简单解释一下,

想法

完整的捣鼓下来其实也和学习 Latex 难度差不多了,但是配置完了这一套,只要要求不变,我再写报告的速度会加快很多很多,因为我只需要专注的写 Markdown 就好了😄。

PS: 这个博客所有的文章就是使用 Markdown 编写的。

]]>
@@ -293,7 +293,7 @@ /anu-comp2310-assignment1/ -

原创发表于 DavidZ Blog,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。

敬告

本博客仅供参考,请不要抄袭。

前言

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

问题

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量球的信息(加速度,速度,位置),并且加满能量,而当靠近的时候,能够互相交换一次信息,这个信息的内容是自己定义的。在能量耗尽后就消失了,而我们需要做的就是在一定的时间内,保证尽可能多的存活。

分析

其实这个问题最关键的地方在于,没有一个中央的控制节点,也就是说对于每一个来说都是完全平等且独立的。所以我们需要他们能够尽可能的一直处在能够交流的状态,并且都能知道能量球在哪里。

注意
这个问题在没有中央控制时不存在最优解,我们只能无线接近最优解。
我采用的是球形模型,这个模型参考于这次作业的 Examples
在和我的同学互相交流时,这个模型是最普遍的,解决方案是最多的,效果也是相对最好的。

3D球形模型

2D球形模型

球形模型设计的两大重点是:

  1. 所有的都均匀平等地分布在球面上(球面是个相对概念,可以是球壳???)。
  2. 所有的都能随时交流,也就是说大家形成一个通讯网络。

实现

注意
所有的 Ada 代码都是示意性的,有可能不能直接在项目中使用。

Stage A&B

这个阶段中,能量球只有一个,我们让所有的都围绕这个能量球运动来实现一个基本的球形模型。

基本程序结构(Basic Program Structure)

程序基本的结构是一个死循环,每次循环分为 4 个步骤:

  1. 判断能量球信息
  2. 发送信息
  3. 接受信息
  4. 设置目的地和油门

消息结构(Message Structure)

最基础的消息需要包括:

  1. 能量球的信息
  2. 获得能量球信息的时间戳

中央控制(Central Control)

允许中央控制是 Stage 1 中的条件,我在作业中跳过了这一部分,因为

  1. 在允许中央控制时,该问题存在最优解,该最优解应该是一个数学问题,对我来说难度过大。
  2. 后面的 Stage 2,3,4 均不允许中央控制。

能量球位置估计(Energy Globe Position Estimation)

能量球位置估计

这个问题类似于一个追击问题(红球是一个匀速导弹,蓝球是拦截导弹),我们需要求的是预计追击时间$T_e$。

能量球到追击点$P_m$,两个坐标相同,所以,

$$
P_m=VeT_{total}+P_e
$$

易得总时间,

$$
T_{total}=T_f-T_n+T_e
$$

通过边相等得,

$$
P_e+(T_f-T_n+T_e)V_e=V_vT_e+\frac{1}{2}A_vT_e^2+P_v
$$

即可解出$T_e$。

注意
存在无法追击的情况,即($\Delta<0$),因为我们这里是严格的计算,实际上整个追击过程只有 1-2 秒,并且在不断地更新能量球的信息,所以预计的那一段时间$T_e$通常可以忽略不计。但是在可以计算时,能够提供更加准确的预计到达时间,从而让能够更加精准的决策何时去充电。

充电决策(Charge Determination)

当同时满足以下两个条件时:

  1. 知道能量球的信息
  2. 的预计剩余能量小于等于警戒能量

预计剩余能量:

Left_Charge := Current_Charge - Current_Discharge_Per_Sec * Estimated_Time;

半径决策(Radius Determination)

半径决策

半径向量:

Radius_Vector := Radius_Distance * Norm (Position - Vehicle_Message.EG.Position);

的位置:

Destination := Vehicle_Message.EG.Position + Radius_Vector;

其中有些变量的值或初始值是由经验确定的

  1. Radius_Distance的值是0.3,是因为多次实验发现在 64 个,128 个,256 个的情况下0.3表现均衡。
  2. Destination的初始值是(0, 0, 0),这样能够避免一开始时四散,导致失去联系,不能构成球形。

使用当前能量优化半径(Radius Optimization With Current Charge)

使用当前能量优化半径

Radius_Vector = (0.75 + 0.25 * Current_Charge) * Radius_Vector;

0.750.25都是人为确定的,没什么依据😄。

一个解决碰撞的机制(A Solution To Collision)

注意
这个机制未经过控制变量实验验证,只是理论上分析得到的。

一个解决碰撞的机制

因为离的足够近时会发生碰撞,表现为大家都减速不动。所以当一个从外层到能量球去加油时,周围的减速会一定程度的减少碰撞的发生。

实现时,需要在消息结构中添加Vehicle_Charge来判断谁的能量更低。

Stage C

这个阶段中,能量球有两个或更多。我们遇到的新问题有:

  1. 如何决策去围绕哪一个能量球运动
  2. 如何自适应球形模型大小的变化

多个能量球决策(Multiple Energy Globes Decision)

当有多个能量球时(能量球还有可能凭空消失),每个都要独立的选择其中一个作为他所在球形模型的球心,而且这个过程时动态的。

我们分两种情况去讨论这个问题:

1. 发现了两个以上能量球

这种情况比较简单,我们只需要从中选择最近的哪一个即可。距离公式如下:

distance := EG.Position + (Clock - EG_Find_Time) * EG.Velocity - Vehicle_Position
2. 从别的获得的信息中有新的能量球

这种情况实际上是非常复杂的,因为存在一种情况:两个说的时同一个能量球,但是不是同时发现的,很难判断是否是同一个能量球

我们可以使用时间戳来判断获得更新的能量球。但是这个更新不能以时间戳作为唯一判据,因为存在一种情况,车A知道一个旧的能量球,但是发现的时间已经过去很久了,车B发现一个新的能量球,从远处靠近车A,时,两车交换信息,该如何选择呢?

所以,我又加入了一个失效时间,来解决上述问题。

Clock - Vehicle_Message.EG_Update_Time > Vehicle_Message_Expire_Time

当上述条件为真时,才会选择更新的信息。

使用旋转优化(Optimization With Rotation)

旋转半径

旋转轴

2D旋转半径

3D旋转

相对于静态的在球面等待,动态的在球面旋转在实验中取得了更稳定的表现。

注意
这个优化措施可能无效,我的同学们对这个优化反应褒贬不一,但是我觉得确实让这个模型更好看啦😄

旋转半径向量与旋转轴垂直:

$$
X_rX_a+Y_rY_a+Z_rZ_a=0
$$

易得无数个解,但是为了尽量让两个不会面对面相撞(随机赋值的话),这里手动赋值$X_a$和$Y_a$为$1$,求得唯一解。

自动半径适应(Automatic Radius Adaptation)

通讯环

通讯环内

通讯环外

我们在 Stage A&B 中的半径是手动设置的,但是在 Stage C 中,每个球星模型的的数量是动态的,如果半径不跟随数量变化,那么就有可能丢失通讯。

在理想的球星模型中,我们可以发现一个通讯环,在通讯环中的所有都是互联的,并且中心的能量球很难突破这层环。在进出通讯环时,我们可以通过当时的位置,动态修正半径大小。

我们分三种情况讨论该模型:

  1. 半径过大,此时会有更多的进到通讯环以内,从而使得半径变小。
  2. 半径国小,此时会有更多的进到通讯环以外,从而使得半径变大。
  3. 半径正好,进到通讯环以内的和进到通讯环以外的大致是相同的,所以半径会稳定在某一个数值。

在自动修正半径时,我们需要一个学习率参数Track_Correction_Rate,来确保不会因为充能量的不确定性而使得半径不稳定。

要实现该模型,我们还需要存在一个弹出通讯环的效果,即能量球加完能量后,弹出到通讯环外。实现如下,

Actual_Radius_Vector := 1.5 * Rotated_Radius_Vector;

Stage D

最后一个阶段,要求之间随机协商出一定数量的存活,剩下的自主“死亡“,比如一开始是 64 个,最终要求剩下 42 个。

这个问题最简单的解决方案是直接从 1 开始分配编号,按照编号顺序“死亡”就好啦,但是我觉得这个方案无法体现随机

通过分析,这个类似于现在大火的区块链中最重要的一个问题,即分布式节点如何达成共识,解决方案也是一样的:共识算法。

推荐观看李永乐老师:拜占庭将军问题是什么?区块链如何防范恶意节点?

共识算法(Consensus Algorithm)[1]

在这里我们仅利用共识算法的思想(不解决恶意节点问题),利用时间戳达成共识。

的通讯过程中,我们约定以下原则:

  1. 在消息中添加三个字段:Vehicle_No数组,Target_No_of_Elements数组长度和Vehicle_List_Update_Time上一次更新时间。
  2. 所有的一直都能接受和发送信息。
  3. 在最开始,所有的都把自己的编号放到数组的第一个位置。
  4. 如果接收到的信息与自身存储的信息不同(数组长度不同,或者上一次更新时间不同),那么按照下面的规则确定保留哪个
    保留数组更长的那个
    选择上一次更新时间更早的那个
  5. 检查自己的编号是否在Vehicle_No数组中,若不在并且仍有空间,那么就把自己的编号加进去。
  6. 在上一次更新时间又Confirm_Time_Interval秒后,如果数组已满并且自己的编号不在里面,那么该就不能再去加能量了。

经过实验,在 64 个,缩减到 42 个的情况下,Confirm_Time_Interval设置为 1 秒就可以满足要求。

结果[2]

截图

截图

Stage A&B(Single_Globe_In_Orbit)

Initial NumberTarget NumberDurationTest timesAverage ResultSurvival RateAverage Frame Rate
32325 min531.80.9937530 Hz
64645 min563.40.99062528 Hz
1281285 min5126.80.99062520 Hz
2562565 min52330.9101569 Hz

Stage A&B

Stage C(Random_Globes_In_Orbits)

Initial NumberTarget NumberDurationTest timesAverage ResultSurvival RateAverage Frame Rate
32325 min526.80.837530 Hz
64645 min560.20.94062528 Hz
1281285 min5109.20.85312520 Hz
2562565 min5208.20.8132819 Hz

Stage C

Stage D(Random_Globes_In_Orbits)

Initial NumberTarget NumberDurationTest timesAverage ResultSurvival RateAverage Frame Rate
32425 min5240.57142930 Hz
64425 min537.40.89047628 Hz
1281005 min583.40.83420 Hz
2561505 min51330.8866679 Hz

Stage D

感谢

感谢所有在作业中帮助过我的同学,辅导员和老师❤️。


  1. 共识算法:https://en.wikipedia.org/wiki/Consensus_decision-making ↩︎

  2. 测试平台: 笔记本 Intel I7 处理器 @ 3.43GHz,16GB 内存。因为我是用 Python 编写测试脚本,通过识别当前程序线程数量来判断的数量的,所以测试结果可能不准确。 ↩︎

]]>
+

原创发表于 DavidZ Blog,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。

敬告

本博客仅供参考,请不要抄袭。

前言

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

问题

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量球的信息(加速度,速度,位置),并且加满能量,而当靠近的时候,能够互相交换一次信息,这个信息的内容是自己定义的。在能量耗尽后就消失了,而我们需要做的就是在一定的时间内,保证尽可能多的存活。

分析

其实这个问题最关键的地方在于,没有一个中央的控制节点,也就是说对于每一个来说都是完全平等且独立的。所以我们需要他们能够尽可能的一直处在能够交流的状态,并且都能知道能量球在哪里。

注意
这个问题在没有中央控制时不存在最优解,我们只能无线接近最优解。
我采用的是球形模型,这个模型参考于这次作业的 Examples
在和我的同学互相交流时,这个模型是最普遍的,解决方案是最多的,效果也是相对最好的。

3D球形模型

2D球形模型

球形模型设计的两大重点是:

  1. 所有的都均匀平等地分布在球面上(球面是个相对概念,可以是球壳???)。
  2. 所有的都能随时交流,也就是说大家形成一个通讯网络。

实现

注意
所有的 Ada 代码都是示意性的,有可能不能直接在项目中使用。

Stage A&B

这个阶段中,能量球只有一个,我们让所有的都围绕这个能量球运动来实现一个基本的球形模型。

基本程序结构(Basic Program Structure)

程序基本的结构是一个死循环,每次循环分为 4 个步骤:

  1. 判断能量球信息
  2. 发送信息
  3. 接受信息
  4. 设置目的地和油门

消息结构(Message Structure)

最基础的消息需要包括:

  1. 能量球的信息
  2. 获得能量球信息的时间戳

中央控制(Central Control)

允许中央控制是 Stage 1 中的条件,我在作业中跳过了这一部分,因为

  1. 在允许中央控制时,该问题存在最优解,该最优解应该是一个数学问题,对我来说难度过大。
  2. 后面的 Stage 2,3,4 均不允许中央控制。

能量球位置估计(Energy Globe Position Estimation)

能量球位置估计

这个问题类似于一个追击问题(红球是一个匀速导弹,蓝球是拦截导弹),我们需要求的是预计追击时间$T_e$。

能量球到追击点$P_m$,两个坐标相同,所以,

$$
P_m=VeT_{total}+P_e
$$

易得总时间,

$$
T_{total}=T_f-T_n+T_e
$$

通过边相等得,

$$
P_e+(T_f-T_n+T_e)V_e=V_vT_e+\frac{1}{2}A_vT_e^2+P_v
$$

即可解出$T_e$。

注意
存在无法追击的情况,即($\Delta<0$),因为我们这里是严格的计算,实际上整个追击过程只有 1-2 秒,并且在不断地更新能量球的信息,所以预计的那一段时间$T_e$通常可以忽略不计。但是在可以计算时,能够提供更加准确的预计到达时间,从而让能够更加精准的决策何时去充电。

充电决策(Charge Determination)

当同时满足以下两个条件时:

  1. 知道能量球的信息
  2. 的预计剩余能量小于等于警戒能量

预计剩余能量:

Left_Charge := Current_Charge - Current_Discharge_Per_Sec * Estimated_Time;

半径决策(Radius Determination)

半径决策

半径向量:

Radius_Vector := Radius_Distance * Norm (Position - Vehicle_Message.EG.Position);

的位置:

Destination := Vehicle_Message.EG.Position + Radius_Vector;

其中有些变量的值或初始值是由经验确定的

  1. Radius_Distance的值是0.3,是因为多次实验发现在 64 个,128 个,256 个的情况下0.3表现均衡。
  2. Destination的初始值是(0, 0, 0),这样能够避免一开始时四散,导致失去联系,不能构成球形。

使用当前能量优化半径(Radius Optimization With Current Charge)

使用当前能量优化半径

Radius_Vector = (0.75 + 0.25 * Current_Charge) * Radius_Vector;

0.750.25都是人为确定的,没什么依据😄。

一个解决碰撞的机制(A Solution To Collision)

注意
这个机制未经过控制变量实验验证,只是理论上分析得到的。

一个解决碰撞的机制

因为离的足够近时会发生碰撞,表现为大家都减速不动。所以当一个从外层到能量球去加油时,周围的减速会一定程度的减少碰撞的发生。

实现时,需要在消息结构中添加Vehicle_Charge来判断谁的能量更低。

Stage C

这个阶段中,能量球有两个或更多。我们遇到的新问题有:

  1. 如何决策去围绕哪一个能量球运动
  2. 如何自适应球形模型大小的变化

多个能量球决策(Multiple Energy Globes Decision)

当有多个能量球时(能量球还有可能凭空消失),每个都要独立的选择其中一个作为他所在球形模型的球心,而且这个过程时动态的。

我们分两种情况去讨论这个问题:

1. 发现了两个以上能量球

这种情况比较简单,我们只需要从中选择最近的哪一个即可。距离公式如下:

distance := EG.Position + (Clock - EG_Find_Time) * EG.Velocity - Vehicle_Position
2. 从别的获得的信息中有新的能量球

这种情况实际上是非常复杂的,因为存在一种情况:两个说的时同一个能量球,但是不是同时发现的,很难判断是否是同一个能量球

我们可以使用时间戳来判断获得更新的能量球。但是这个更新不能以时间戳作为唯一判据,因为存在一种情况,车A知道一个旧的能量球,但是发现的时间已经过去很久了,车B发现一个新的能量球,从远处靠近车A,时,两车交换信息,该如何选择呢?

所以,我又加入了一个失效时间,来解决上述问题。

Clock - Vehicle_Message.EG_Update_Time > Vehicle_Message_Expire_Time

当上述条件为真时,才会选择更新的信息。

使用旋转优化(Optimization With Rotation)

旋转半径

旋转轴

2D旋转半径

3D旋转

相对于静态的在球面等待,动态的在球面旋转在实验中取得了更稳定的表现。

注意
这个优化措施可能无效,我的同学们对这个优化反应褒贬不一,但是我觉得确实让这个模型更好看啦😄

旋转半径向量与旋转轴垂直:

$$
X_rX_a+Y_rY_a+Z_rZ_a=0
$$

易得无数个解,但是为了尽量让两个不会面对面相撞(随机赋值的话),这里手动赋值$X_a$和$Y_a$为$1$,求得唯一解。

自动半径适应(Automatic Radius Adaptation)

通讯环

通讯环内

通讯环外

我们在 Stage A&B 中的半径是手动设置的,但是在 Stage C 中,每个球星模型的的数量是动态的,如果半径不跟随数量变化,那么就有可能丢失通讯。

在理想的球星模型中,我们可以发现一个通讯环,在通讯环中的所有都是互联的,并且中心的能量球很难突破这层环。在进出通讯环时,我们可以通过当时的位置,动态修正半径大小。

我们分三种情况讨论该模型:

  1. 半径过大,此时会有更多的进到通讯环以内,从而使得半径变小。
  2. 半径国小,此时会有更多的进到通讯环以外,从而使得半径变大。
  3. 半径正好,进到通讯环以内的和进到通讯环以外的大致是相同的,所以半径会稳定在某一个数值。

在自动修正半径时,我们需要一个学习率参数Track_Correction_Rate,来确保不会因为充能量的不确定性而使得半径不稳定。

要实现该模型,我们还需要存在一个弹出通讯环的效果,即能量球加完能量后,弹出到通讯环外。实现如下,

Actual_Radius_Vector := 1.5 * Rotated_Radius_Vector;

Stage D

最后一个阶段,要求之间随机协商出一定数量的存活,剩下的自主“死亡“,比如一开始是 64 个,最终要求剩下 42 个。

这个问题最简单的解决方案是直接从 1 开始分配编号,按照编号顺序“死亡”就好啦,但是我觉得这个方案无法体现随机

通过分析,这个类似于现在大火的区块链中最重要的一个问题,即分布式节点如何达成共识,解决方案也是一样的:共识算法。

推荐观看李永乐老师:拜占庭将军问题是什么?区块链如何防范恶意节点?

共识算法(Consensus Algorithm)[1]

在这里我们仅利用共识算法的思想(不解决恶意节点问题),利用时间戳达成共识。

的通讯过程中,我们约定以下原则:

  1. 在消息中添加三个字段:Vehicle_No数组,Target_No_of_Elements数组长度和Vehicle_List_Update_Time上一次更新时间。
  2. 所有的一直都能接受和发送信息。
  3. 在最开始,所有的都把自己的编号放到数组的第一个位置。
  4. 如果接收到的信息与自身存储的信息不同(数组长度不同,或者上一次更新时间不同),那么按照下面的规则确定保留哪个
    保留数组更长的那个
    选择上一次更新时间更早的那个
  5. 检查自己的编号是否在Vehicle_No数组中,若不在并且仍有空间,那么就把自己的编号加进去。
  6. 在上一次更新时间又Confirm_Time_Interval秒后,如果数组已满并且自己的编号不在里面,那么该就不能再去加能量了。

经过实验,在 64 个,缩减到 42 个的情况下,Confirm_Time_Interval设置为 1 秒就可以满足要求。

结果[2]

截图

截图

Stage A&B(Single_Globe_In_Orbit)

Initial NumberTarget NumberDurationTest timesAverage ResultSurvival RateAverage Frame Rate
32325 min531.80.9937530 Hz
64645 min563.40.99062528 Hz
1281285 min5126.80.99062520 Hz
2562565 min52330.9101569 Hz

Stage A&B

Stage C(Random_Globes_In_Orbits)

Initial NumberTarget NumberDurationTest timesAverage ResultSurvival RateAverage Frame Rate
32325 min526.80.837530 Hz
64645 min560.20.94062528 Hz
1281285 min5109.20.85312520 Hz
2562565 min5208.20.8132819 Hz

Stage C

Stage D(Random_Globes_In_Orbits)

Initial NumberTarget NumberDurationTest timesAverage ResultSurvival RateAverage Frame Rate
32425 min5240.57142930 Hz
64425 min537.40.89047628 Hz
1281005 min583.40.83420 Hz
2561505 min51330.8866679 Hz

Stage D

感谢

感谢所有在作业中帮助过我的同学,辅导员和老师❤️。


  1. 共识算法:https://en.wikipedia.org/wiki/Consensus_decision-making ↩︎

  2. 测试平台: 笔记本 Intel I7 处理器 @ 3.43GHz,16GB 内存。因为我是用 Python 编写测试脚本,通过识别当前程序线程数量来判断的数量的,所以测试结果可能不准确。 ↩︎

]]>
diff --git a/tags/ANU/index.html b/tags/ANU/index.html index d7baa81..36dc129 100644 --- a/tags/ANU/index.html +++ b/tags/ANU/index.html @@ -176,7 +176,7 @@

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

-

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量...

+

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量...

查看全文 diff --git a/tags/Ada/index.html b/tags/Ada/index.html index 39dfe1d..5f958cc 100644 --- a/tags/Ada/index.html +++ b/tags/Ada/index.html @@ -176,7 +176,7 @@

这是 ANU COMP2310的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。

-

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量...

+

根据Assignment 1 PDF中的描述,大概的意思就是在三维空间中有许多的,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个能量球,当然也是在运动中的,同样具有速度和加速度。当能量球靠近的时候,能够获取到能量...

查看全文 diff --git a/tags/Cpp/index.html b/tags/Cpp/index.html index 3c55e5e..8f72bab 100644 --- a/tags/Cpp/index.html +++ b/tags/Cpp/index.html @@ -130,7 +130,7 @@ animation-duration: 2.8s; background-image: radial-gradient(ellipse closest-side, rgba(0, 0, 0, 0.56), #100e17), - url(//davidz.cn/static/blog/2020-01-27-inspur-internship/cover.jpg);"> + url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);"> diff --git a/tags/Linux/index.html b/tags/Linux/index.html index 70f8550..b6d380d 100644 --- a/tags/Linux/index.html +++ b/tags/Linux/index.html @@ -257,7 +257,7 @@
+ url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

diff --git a/tags/Windows/index.html b/tags/Windows/index.html index f4def77..0a0ce30 100644 --- a/tags/Windows/index.html +++ b/tags/Windows/index.html @@ -249,7 +249,7 @@

+ url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

@@ -420,7 +420,7 @@

+ url(https://davidz-blog.oss-cn-beijing.aliyuncs.com/img/langchao-1599636307.jpg);">

diff --git a/write-latex-report-with-markdown/index.html b/write-latex-report-with-markdown/index.html index 6d6c3fd..6b65df7 100644 --- a/write-latex-report-with-markdown/index.html +++ b/write-latex-report-with-markdown/index.html @@ -151,7 +151,7 @@

后来到了澳国立,老师教授们开始极力鼓吹 Latex 和 PDF,基本上算是软性要求我们使用 Latex 编写,还规定了衬线字体,非衬线字体,字号,段落等等,图片还需要是 SVG 格式的矢量图片(最奇葩的是竟然一整节课只讲这个😂),最后生成 PDF 提交(据说这样分数高一些)。所以我开始了漫漫 Latex 学习之路。然而整个过程十分痛苦,装个 TeX Live 跑了好几个小时,换个字体换的我一脸懵逼,预览竟然都不是实时的!!!我甚至觉得还不如 Word 好用,又开始找那些 Latex 编辑器(同学的 MacOS 上有很不错的,然而我是 Windows),之后是在线编辑器Overleaf,体验还行,但是一边学习 Latex 一边做实验写报告的体验实在是太差劲了,人都要有丝分裂了。我就先用 Markdown 记录下来,想着之后再改成 Latex 吧。然后,我用了 2 天左右的时间,找到了 Markdown 直接转报告的方法,就没再碰 Latex(还是懒)。

样例

eisvogel 主题样例

-

你也可以从这里看一下我的成果作为参考,我觉得完全符合我的要求。

+

你也可以从这里看一下我的成果作为参考,我觉得完全符合我的要求。

思路

其实思路很简单,一切的一切都是因为Pandoc这个文档转换软件软件(类似于影音界的格式工厂?)的存在。它官网有一张巨型图片描述了它可以从那些格式转换成那些格式,基本上可以说覆盖了常见的所有文档格式。所以我们就可以用它把 Markown 语言写的文档转换成 PDF 格式的报告,过程中再用一套模板修饰一下就好啦。