adbird(広告鳥) 備忘録

A5縦書き原稿PDFを、A4用紙・小冊子面付けしたPDFに

※追記した方法のほうが楽。


Pandoc + LaTeX で markdownからA5・縦書・2段組の小説本のPDFを作成」で作ったA5縦書きの原稿データを、A4用紙に2ページ面付けしたPDFファイルを作成する。

pdftk と pdfjam が必要。

$ sudo apt-get install pdftk

pdfjamはtexliveに入っている。インストールはTeX Wiki / Linuxを参考に。

手っ取り早くインストールするには以下の方法で。

sudo apt install texlive texlive-extra-utils

中綴じ用面付表 で、面付けの順番を確認する。

例えば、16ページなら、
1,16,15,2,3,14,13,4,5,12,11,6,7,10,9,8
の順番。

以下、①面付け順に並び替え、②A4用紙に2枚並べる。

$ pdftk 原稿.pdf cat 1 16 15 2 3 14 13 4 5 12 11 6 7 10 9 8 output 原稿001.pdf

$ pdfnup 原稿001.pdf --outfile 原稿完成.pdf --paper a4paper --nup 2x1

できたA4データを両面印刷。とじる辺の設定に気をつける。たぶん、短辺とじ印刷のはず。

追記(さらに修正追記)

中綴じ用の面付けをするスクリプト · GitHub というのを作ってくれている先人がいらっしゃった。

zsh と pdfjam が必要なのでインストール。

$ sudo apt install zsh

pdfjamはtexliveに入っている。インストールはTeX Wiki / Linuxを参考に。

手っ取り早くインストールするには以下の方法で。

$ sudo apt install texlive texlive-extra-utils

中綴じ用の面付けをするスクリプト · GitHub から「Download Zip」をクリックして、「nakatoji.zsh」を取り出す。

(※修正追記)中綴じ用の面付けをするスクリプト · GitHub は横書き=左綴じ用だったので、下記のように縦書き=右綴じ用に修正して(echo -nの中を左右入れ替えただけ)、改めてnakatoji.zshとして保存。

#!/bin/zsh
[ -z $1 ] && exit -1
nakatoji_sequence(){
    last=$(expr 4 \* $1)
    for i in {1..$1} ; do
        #左綴じ
        #echo -n "$(expr $last - $i \* 2 + 2),$(expr $i \* 2 - 1),"
        #echo -n "$(expr $i \* 2),$(expr 1 + $last - $i \* 2),"
        #右綴じ
        echo -n "$(expr $i \* 2 - 1),$(expr $last - $i \* 2 + 2),"
        echo -n "$(expr 1 + $last - $i \* 2),$(expr $i \* 2),"
    done | sed "s/,$//g"
}
file=$(echo $1 | sed "s/\.pdf$//g")
pages=$(pdfinfo $file.pdf | grep Pages | sed "s/^.*: *//g")
pdfjam --outfile /dev/stdout $file.pdf -,{},{},{} 2>/dev/null | \
    pdfjam --nup 2x1 --landscape --outfile ${file}_nakatoji.pdf \
    /dev/stdin $(nakatoji_sequence $(expr \( $pages + 3 \) / 4)) 2>/dev/null

任意のフォルダに nakatoji.zsh と、A5縦書きの原稿PDFデータを入れて、

$ zsh nakatoji.zsh 原稿.pdf

とすれば、面付けされたA4データが作成されているはず。

markdown + reveal.js スライドと同時にレジュメ生成 2018年2月版

概要

注意事項

  • Pandocのバージョンによってはうまく動作しない場合があります。この記事は Pandoc 2.1.1 で動作確認しています。
  • reveal.js は、2018年2月6日時点のもので動作確認。こちらもその後、更新があった場合には、うまく動作しない場合があります。
  • wkhtmltopdf 0.12.4 で動作確認。上記と同じ注意事項。
  • LinuxUbuntu)では動作確認していますが、Windowsの方は動作確認していません。あしからず。

コマンド一発で、markdownからreveal.jsの「htmlスライド」と、そのスライドから配布資料用の「レジュメ」のpdfを生成する方法。

pandocで、markdownからreveal.jsのスライド作成は、まあ、普通。
markdown → (Pandoc + テンプレートを適用) → htmlスライド(reveal.js)

特徴的なのは、レジュメの方。
markdown →(pandoc)→ html + css →(wkhtmltopdf)→ pdf という流れ。

一般的にスライドを配布資料として印刷しようとすると、1枚の用紙にスライドを縮小させたのを4〜6枚程度並べたものになるだろう。しかし、それだと余白がもったいないし、余白がもったいないからと言ってさらにたくさんのスライドを並べたら、文字が小さくなって読みづらい。

そこで配布資料の方は、文書作成ソフトで作ったような、いわゆる「レジュメ」形式で生成できるようにした。

フォルダ内の構成

任意のフォルダ
 ┃
 ┣ reveal.jsフォルダ
 ┃ (reveal.js-master.zipを解凍してできたフォルダをreveal.jsにリネーム)
 ┣ adbird.css  (スライドに適用させるCSS
 ┣ adbird-text.css (レジュメに適用させるCSS
 ┣ makeslide.sh  (Linuxのみ。スクリプトファイル)
 ┣ makeslide.bat  (Windowsのみ。スクリプトファイル)
 ┣ テンプレート.html   (スライドのテンプレート)
 ┣ テスト.md   (スライド・レジュメ原稿ファイル)

下準備 インストール・ダウンロード編

  • Pandocをインストール
    • 「There is a package installer at pandoc’s download page.」のリンク先の下の方にあるインストーラーをダウンロードして、インストール。
  • reveal.jsをダウンロード
    • 「Clone or Download」をクリックして、zipをダウンロード。
    • zipを解凍、フォルダをreveal.jsにリネームして、上記のように、原稿のマークダウンファイルなどと同じ任意のフォルダ内に置く。
  • wkhtmltopdfをインストール

Windowsの場合、パスを通す必要があるかも。

Windowsでプログラムやスクリプトにパスを通す

下準備 設定ファイル編

adbird.css

スライドに適用させるcss

まあ、適当にいじってくださいw。

/*フォント大きさ*/
.reveal p{font-size:28pt;}
div.xxs {font-size: 13pt; }
div.xs {font-size: 15pt; }
div.s {font-size: 20pt; }
div.m{font-size: 25pt; }
div.l{font-size:large}
div.xl{font-size:x-large}
div.xxl{font-size:xx-large}
div.smaller { font-size: smaller }
div.footnote { font-size: smaller; margin-left: 2em; }
div.center { text-align: center }

.reveal h1{font-size:40pt;}
/* .reveal h1{font-size:35pt;} */
section h1.title{font-size:50pt;}
section h2.author{font-size:25pt;}
section h3.date{font-size:25pt;}
.reveal h2{font-size:30pt;}
section.xxs {font-size: 13pt; }
section.xs {font-size: 15pt; }
section.s {font-size: 20pt; }
section.m{font-size: 25pt; }
section.l{font-size:large}
section.xl{font-size:x-large}
section.xxl{font-size:xx-large}
section.smaller { font-size: smaller }
section.footnote { font-size: smaller; margin-left: 2em; }
section.center { text-align: center }

span.xxs {font-size: 13pt; }
span.xs {font-size: 15pt; }
span.s {font-size: 20pt; }
span.m{font-size: 25pt; }
span.l{font-size:large}
span.xl{font-size:x-large}
span.xxl{font-size:xx-large}
span.smaller { font-size: smaller }
span.footnote { font-size: smaller; margin-left: 2em; }
span.center { text-align: center }

.reveal table {font-size: 20pt; }

/*画像キャプションフォント*/
.reveal figcaption {font-size: 13pt; }


/*強調*/
em {
    color:yellow; 
    font-weight:bold;
    font-style:normal;
}

/*強調
em {
    color:#FF9900; 
    font-weight:bold;
    font-style:normal;
}*/

div.build{
margin:10pt;
}

/*リスト*/

.reveal li{font-size:28pt;}

/*定義リスト*/
dt {
    color:red; 
    font-weight:bold;
    font-style:normal;
}

dd{
    line-height:1.3;
}

/*下線 取り消し線*/
.underline{text-decoration:underline;}
.overline {text-decoration:overline}
.cancel {text-decoration:line-through}

/* スライド全体のテキスト位置 */
section {text-align: left;}

/* テキスト右寄せ */
.textright { text-align: right; }  

/* テキスト左寄せ */
.textleft { text-align: left; }  

/*画像センタリング*/
img.center{
    display:block;
    margin:0 auto 100 auto;
}

/*画像回りこみ解除*/
.newpara { clear:left }

/*ブロック・画像回り込み*/
div.floatleft{
    float: left;
}

div.floatright{
    float: right;
}

img.floatleft{
    float: left;
}

img.floatright{
    float: right;
}

/*画像キャプション
.imgcap{
    font-size:xx-small;
    margin:0;
    padding:0;
    line-height:1em;
}*/

/*コード*/
code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  background-color: #669933;
  border-radius: 3px; }
 
pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; 
  text-indent: 0em;
}
 
.highlight pre {
  background-color: ;
  border: 1px solid #cccccc;
  font-size: 14px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
 
pre {
  background-color: ;
  border: 1px solid #cccccc;
  font-size: 14px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 14px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

/*引用*/
.reveal blockquote {
    text-align: left;
    font-size: 22pt;
width:90%;
    }
.reveal blockquote p{
    line-height:1.5;
}
    
/*スライド時の非表示*/
.SlideNoDisplay {display:none;}

adbird-text.css

レジュメに適用させるcss

これも適当にいじってくださいw。

/*フォント大きさ*/
.xxs {font-size: 7pt; }
.xs {font-size: 8pt; }
.s {font-size: 9pt; }
.m{font-size: 9pt; }
.l{font-size:large}
.xl{font-size:x-large}
.xxl{font-size:xx-large}
.smaller { font-size: smaller }
.footnote { font-size: smaller; margin-left: 2em; }
.center { text-align: center }

.reveal h1{font-size:50pt;}

h1{font-size:10pt}
h2{font-size:10pt}
h3{font-size:10pt}
p{font-size:10pt}

.date{font-size:10pt}

/*強調*/
em {
    color:black; 
    font-weight:bold;
    font-style:normal;
}

div.build{
margin:10pt;
}

/*リスト*/

li{font-size:10pt}

/* 表 */

th{ font-size:10pt;
}

td{ font-size:10pt;
}

/*定義リスト*/
dt {
    color:black; 
    font-weight:bold;
    font-style:normal;
    font-size:10pt;
}

dd{
    line-height:1.3;
    font-size:10pt;
}

/*下線 取り消し線*/
.underline {
    border-bottom:solid 2px black;
}

.overline {text-decoration:overline}
.cancel {text-decoration:line-through}

/* テキスト右寄せ */
.textright { text-align: right; }  

img.big{
max-width: 500px;
  max-height: 500px;
}

/*画像一括サイズリサイズ*/
img{
max-width: 230px;
  max-height: 230px;
}

/*画像センタリング*/
img.center{
    display:block;
    margin:0 auto 0 auto;
}

/*画像回りこみ解除*/
.newpara { clear:left }

/*ブロック・画像回り込み*/
div.floatleft{
    float: left;
}

div.floatright{
    float: right;
}

img.floatleft{
    float: left;
}

img.floatright{
    float: right;
}

/*画像キャプション*/
.imgcap{
    font-size:xx-small;
    margin:0;
    padding:0;
    line-height:1em;
}

/*引用*/
blockquote{font-size: 10pt;}

/*コード*/
code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }
 
pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; 
  text-indent: 0em;
}
 
.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 14px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
 
pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 14px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 14px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

/*レジュメ時の非表示*/
.TextNoDisplay {display:none;}
.author {display:none;}
.date {display:none;}


/*改ページ*/
.pagebreak{
    page-break-before:always;
    padding-top:0em;
    text-align: justify;
    text-justify: inter-ideograph;
}

テンプレート.html

reveal.jsフォルダに入っているindex.htmlを以下のように編集して、「テンプレート.html」として保存。

元々のindex.htmlにあるcssやjsなどのリンク先の頭に「reveal.js/」をつけるのを忘れないように。

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

        <title>reveal.js</title>

        <link rel="stylesheet" href="reveal.js/css/reveal.css">
        <link rel="stylesheet" href="reveal.js/css/theme/black.css">

        <!-- Theme used for syntax highlighting of code -->
        <link rel="stylesheet" href="reveal.js/lib/css/zenburn.css">


        <!-- 自作カスタムcss -->
        <link rel="stylesheet" href="adbird.css">

        <!-- Printing and PDF exports -->
        <script>
            var link = document.createElement( 'link' );
            link.rel = 'stylesheet';
            link.type = 'text/css';
            link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css';
            document.getElementsByTagName( 'head' )[0].appendChild( link );
        </script>
    </head>
    <body>
        <div class="reveal">
            <div class="slides">
<!--    ここをコメントアウト
                <section>Slide 1</section>
                <section>Slide 2</section>              -->

<!-- ここから追加 -->

<section id="title-slide">
  <h1 class="title">$title$</h1>
  <p class="author">$author$</p>
  <p class="date">$date$</p>
</section>

$body$

<!-- ここまで -->

            </div>
        </div>

        <script src="reveal.js/lib/js/head.min.js"></script>
        <script src="reveal.js/js/reveal.js"></script>

        <script>
            // More info about config & dependencies:
            // - https://github.com/hakimel/reveal.js#configuration
            // - https://github.com/hakimel/reveal.js#dependencies
            Reveal.initialize({
                dependencies: [
                    { src: 'reveal.js/plugin/markdown/marked.js' },
                    { src: 'reveal.js/plugin/markdown/markdown.js' },
                    { src: 'reveal.js/plugin/notes/notes.js', async: true },
                    { src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
                ]
            });
        </script>
    </body>
</html>

makeslide.sh

Linuxスクリプト。以下のコマンドを並べただけ。

  • pandocで、スライド・レジュメ原稿のマークダウンファイルを、reveal.js用のhtmlスライドに変換。
  • pandocで、スライド・レジュメ原稿のマークダウンファイルを、レジュメ用のhtmlファイルに変換。
  • wkhtmltopdfで、レジュメ用のhtmlファイルを、レジュメpdfファイルに変換。
  • レジュメ用のhtmlファイルを削除。
#!/bin/sh

pandoc -t revealjs --template テンプレート.html $1.md -o $1_スライド.html
pandoc -c adbird-text.css  -s -t html -o $1_レジュメ.html $1.md
wkhtmltopdf --disable-smart-shrinking --margin-top 20 --margin-left 20 --margin-right 20 --margin-bottom 20 --footer-center '[page]/[topage]' $1_レジュメ.html $1_レジュメ.pdf
rm -f $1_レジュメ.html

makeslide.bat

動作確認はしていません。ちゃんと動くとは思いますが…。あしからず。

pandoc -t revealjs --template テンプレート.html -o %~n1.html %~n1.md
pandoc -c adbird-text.css -s -t html -o %~n1text.html %~n1.md
wkhtmltopdf --disable-smart-shrinking --margin-top 20 --margin-left 20 --margin-right 20 --margin-bottom 20 --footer-center '[page]/[topage]' %~n1text.html %~n1text.pdf
del %~n1text.html

スライド・レジュメ原稿を作成する(テスト.md)

% スライドタイトル
% 作成者
% 日付等

# 見出しレベル1(#)について

# 見出しレベル1(#)は横に移動する。

# 見出しレベル1(#)作成時の注意↓

## 見出しレベル1の下には本文を書かない。

```markdown
# 見出しレベル1

こんなふうに見出しレベル1の下に本文を書くと、スライドが正しく生成されない。  
あくまで見出しレベル1は大項目の表紙だと考える。
```

# 見出しレベル2(##)について

## 見出しレベル2(##){.TextNoDisplay}

見出し2は下にスライドが作成されていく。

## 見出しレベル2(##){.TextNoDisplay}

さらに下にスライドを作成。


# PDFレジュメのためのひと工夫 その1<br />見出しや画像を非表示にする

## CSSの設定

adbird-text.css

```
.TextNoDisplay {display:none;}
```

## レジュメ時に見出しを非表示にする

- 別々のスライド。しかし、連続した内容なので、*見出し(レベル2(##))*は*同じ*という場合がある。
- そのままレジュメにすると、同じ見出しが何度も出てきてしまう。
- そこで、`## 見出し2{.TextNoDisplay}`のように、見出しの後ろに`{.TextNoDisplay}`をつける。
- そうすると、adbird-text.css の設定でその見出しは、*レジュメの時だけ見えなくなる*。
- レベル1(#)の見出しの後ろにつけても同様。

## レジュメ時に見出しを非表示にする{.TextNoDisplay}

たとえば、これは上のスライドと見出しは同じだが、本文が違う。   
そこで以下のようにすると、このスライドの見出しはレジュメの時だけ非表示になる。

```
## レジュメ時に見出しを非表示にする{.TextNoDisplay}
```


## レジュメ時に画像を非表示にする

著作権の関係や、紙の節約のためにレジュメに画像は入れたくないと思えば、見出しと同じで画像の後ろに`{.TextNoDisplay}`をつける。

```
![](hoge.jpg){.TextNoDisplay}
```

## スライド1枚丸々を非表示にする{.pagebreak}

スライド1面丸々、レジュメにだけ表示したくない場合は、見出しの後ろに`{.TextNoDisplay}`をつけて、さらに本文もタグで囲めばよい。

```
## 見出し{.TextNoDisplay}

<div class="TextNoDisplay">
スライドの本文
</div>
```

## スライド1枚丸々を非表示にする{.TextNoDisplay}

<div class="TextNoDisplay">
たとえば、このスライドはレジュメのときには表示されない。
</div>

## スライド時に非表示

逆にレジュメには表示されるけれど、スライドのときには表示されないというのもできる。

adbird.css の設定。

`.SlideNoDisplay {display:none;}`

たとえば、

```
この→<span class="SlideNoDisplay">文字</span>←はスライドでは非表示。
```

この→<span class="SlideNoDisplay">文字</span>←はスライドでは非表示。


# PDFレジュメのためのひと工夫 その2<br />任意の場所で改ページ

## CSSの設定

adbird-text.css

```
.pagebreak{
    page-break-before:always;
    padding-top:0em;
    text-align: justify;
    text-justify: inter-ideograph;
}
```

## レジュメ時の改ページ

レジュメ時に、ある見出しのところで改ページを入れたいときは、見出しの後ろに`{.pagebreak}`を入れる。

## この見出しで改ページする{.pagebreak}

```
## この見出しで改ページする{.pagebreak}

```

# 最後のスライドについて

## レベル2(##)の見出しにする

最後のスライドはレベル2(##)の見出しにしないと、ちゃんとスライドが生成されない…。

## おしまい


<!-- 独自記法メモ
レジュメ時に表示しないようにするには、{.TextNoDisplay}
改ページつきの見出しには、{.pagebreak}
-->

コマンド実行

Linux

$ sh makeslide.sh テスト

Windowsエクスプローラーからのコマンドプロンプト起動

$ makeslide.bat テスト

フォルダ内に、「テスト_スライド.html」と「テスト_レジュメ.pdf」ができているはず。

「テスト_スライド.html」をブラウザで開けば、スライドが表示されるはず。

「テスト_レジュメ.pdf」を開けば、以下のようなレジュメができているはず。

レジュメのサンプル画像

f:id:adbird:20171102022749j:plain f:id:adbird:20171102121433j:plain f:id:adbird:20171102022951j:plain

Pandocで画像の幅・高さの比率を維持したまま縮小

Pandocを2.1.1にバージョンアップしてから発生した画像縮小の際のトラブルへの対処方法を教えてもらった。

前提としては、以前書いた「Pandoc で markdown から 論文PDF へ変換」 の記事のように、markdown→Pandocで自作テンプレートtexファイルに $body$ で流しこみ→PDF完成、という手順をとる。

Pandocの以前のバージョンでは

![画像のキャプション](image.jpg){width=5cm}

とすれば、画像の幅が5cmで、高さは自動的に比率を保ったまま、縮小されていた。

しかし、2.1.1(2.0.6からすでにそうだったらしい)に更新して、変換したら、画像の幅は5cmにはなるけど、高さには勝手に textheight がセットされてしまい、縦長に延びた状態の画像になってしまった。

この解決方法をツイッター@myon___ さんに教えていただいた。

自作テンプレートtexファイルのプリアンブルに、以下を貼り付ければ、以前と同様、画像の幅と高さの比率を維持したまま縮小してくれるようになった。

\makeatletter
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
\makeatother
% Scale images if necessary, so that they will not overflow the page
% margins by default, and it is still possible to overwrite the defaults
% using explicit options in \includegraphics[width, height, ...]{}
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}

@myon___さん、本当にありがとうございました。

Geanyエディタのマークダウンプレビュー

プラグインのインストール

Ubuntu16.04の場合、

$ sudo apt-get install geany-plugin-markdown

プラグインをインストール。

ツール>プラグインマネージャ で「Markdownプラグインにチェックを入れて、設定をすればOK。

プレビュー画面を自分好みに設定

デフォルトのままだと見出しのフォントが大きすぎるなど、いまいちなので、

.config/geany/plugins/markdown/

に入っている template.html のcss部分をいじって、自分好みに設定する。

また、プレビュー画面(サイドバー)と編集画面を左右を入れ替えるには、

編集>設定>インターフェイス>サイドバー の、「位置」で左右好きな方に設定すればよい。

template.html の例

ちなみに現在の僕の template.html は以下のような感じ。

<html>
<head>
    <style type="text/css">
        body{
        background-color: @@bg_color@@;
        color: @@fg_color@@;
        }

    h1::before {
        content: counter(chapter) ".";}

        h1{font-family: @@font_name@@;
        font-size: @@font_point_size@@pt;
        font-weight:bold;
        line-height:1.5;
        text-align: justify;
        counter-increment: chapter;
        counter-reset:section;
        }

        h2{font-family: @@font_name@@;
        font-size: @@font_point_size@@pt;
        font-weight:bold;
        }

        p{font-family: @@font_name@@;
        font-size: @@font_point_size@@pt;
        line-height:1.5;
        }

        code {
        font-family: @@code_font_name@@;
        font-size: @@code_font_point_size@@pt;
        }

        /*リスト*/
        ul{list-style-type:circle;}

        /*数字リストをカタカナに*/
        ol {
        list-style-type: katakana;
        }

        li{font-family: @@font_name@@;
        font-size: @@font_point_size@@pt;
        line-height:1.5;}

        /*強調*/
        em {
        font-weight:bold;
        font-style:normal;
        }

    </style>
</head>
<body>
    @@markdown@@
</body>
</html>

章番号をつけないmarkdown記法

たぶん、pandoc-markdown拡張記法。

「はじめに」や「おわりに」、「参考文献」など、特定の章だけに通し番号をつけたくない場合は、見出しの末尾に {-}をつける。

参考リンク:まだ Word で消耗してるの? 大学のレポートを Markdown で書こう

Pandoc で markdown から 論文PDF へ変換

概要

Pandoc(Lualatexエンジン経由)で、markdown(マークダウン)ファイルを論文PDFに変換する方法。
ただし、文系の論文で、環境はLinux(Ubuntu16.04)で、Pandoc 2.1.1。

※Pandocのバージョンによっては正しく動作しなくなる恐れがありますので、あしからず。

う〜ん、でも文系の人でLinux使っている人なんて、僕のようなよほどの変人しかいないだろうなぁ…w。
気が向いたら、Windows対応の記述も追加します…。

フォルダ内の構成

任意のフォルダ
 ┃
 ┣ 原稿.md   (原稿ファイル)
 ┣ breakfbox.sty (TeXスタイルファイル)
 ┣ uline--.sty  (TeXスタイルファイル)
 ┣ テンプレ.tex
 ┣ makepaper.sh  (スクリプトファイル)
 ┣ pic/(画像フォルダ)
   ┣ 001.jpg

下準備 インストール編

Pandocのインストール

Pandoc

「There is a package installer at pandoc’s download page.」のリンク先の下の方にあるインストーラーをダウンロードして、インストール。

LaTeXTeX Live)のインストール

リンク先を参照のこと。Windowsだとインストールに2時間近くかかる…。

TeX Wiki / TeX Live/Windows

TeX Wiki / Linux

下準備 設定ファイル編

TeXスタイルファイル

下線・波線などのために必要。
breakfbox パッケージから、以下の2つのファイルを入手する。

  • uline--.sty
  • breakfbox.sty

テンプレ.tex

テキストエディタ(メモ帳など)で下記の内容をコピペして、「テンプレ.tex」を新規作成。

\documentclass[a4paper,lualatex,ja=standard]{bxjsarticle}

%ルビ、圏点
    \usepackage{luatexja-ruby}
%表
    \usepackage{longtable}
    \usepackage{booktabs}
%下線・波線・囲み文字 https://github.com/doraTeX/breakfbox から uline--.sty と breakfbox.sty を入手
    \usepackage[usetype1]{uline--}
    \usepackage{breakfbox}
%脚注番号を (1)に変更
    \renewcommand\thefootnote{(\arabic{footnote})}
%脚注番号を 1)に変更
    %\renewcommand\thefootnote{\arabic{footnote})}
%リンク
    \usepackage[hidelinks]{hyperref}

%画像
    \usepackage{graphicx}
    %\usepackage[export]{adjustbox}

%画像の幅のみ指定で、画像の幅・高さの比率を維持したまま縮小する
    \makeatletter
    \def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
    \def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
    \makeatother
    % Scale images if necessary, so that they will not overflow the page
    % margins by default, and it is still possible to overwrite the defaults
    % using explicit options in \includegraphics[width, height, ...]{}
    \setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}

\title{$title$} 
\subtitle{\vspace{10truept}{\large $subtitle$}}
\author{$author$} 
\date{$date$} 

\begin{document}
    \maketitle
    % \tableofcontents
    \begin{abstract}$abstract$\end{abstract}

$body$

\end{document}

スクリプトファイル

テキストエディタ(メモ帳など)で下記の内容をコピペして、「makepaper.sh」を新規作成。

#オリジナルのmdをコピーして別名保存
cp $1.md `date +%Y%m%d-$1`.md

#オレオレ記法をTeX記法に置換
#波線
sed -i -e 's/uw{/\\uwave{/g' `date +%Y%m%d-$1`.md
sed -i -e 's/}uw/}/g' `date +%Y%m%d-$1`.md

#下線
sed -i -e 's/ul{/\\uline{/g' `date +%Y%m%d-$1`.md
sed -i -e 's/}ul/}/g' `date +%Y%m%d-$1`.md

#囲み文字
sed -i -e 's/k{/\\breakfbox{/g' `date +%Y%m%d-$1`.md
sed -i -e 's/}k/}/g' `date +%Y%m%d-$1`.md

#ルビ
sed -i -e 's/rb{/\\ruby{/g' `date +%Y%m%d-$1`.md
sed -i -e 's/}rb/}/g' `date +%Y%m%d-$1`.md

#圏点
sed -i -e 's/ten{/\\kenten{/g' `date +%Y%m%d-$1`.md
sed -i -e 's/}ten/}/g' `date +%Y%m%d-$1`.md

#pdfに変換
pandoc `date +%Y%m%d-$1`.md -o `date +%Y%m%d-$1`.pdf --pdf-engine=lualatex --template テンプレ.tex -V papersize=a4 -V classoption=jafont=ipaex

#別名保存したmdを削除
rm -f `date +%Y%m%d-$1`.md

#wordに変換。ただし、ルビの文字等が消えるので注意。
# pandoc $1.md -o `date +%Y%m%d-$1`.docx

原稿作成

以下のような感じで、「原稿.md」を作成。

なぜルビや下線などをLaTeX記法ではなく、オレオレ記法wで書いているかというと、
一つはできるだけ短い記法にしたいということと、
もう一つは、もしhtmlなどの別のファイルに変換したいときに、LaTeX記法のままだと全ての記法(例えば、\uline{下線}\ruby{語句}{ごく}など)の最後が「}」になり、僕の技量では記法ごとの置換が適切にできない(終わりを記法ごとに</span><\/rt><\/ruby>などに区別して置換したいけど、全てが}だと難しい)ので、あえて}ul }rbと明示することによって、それらを</span> <\/rt><\/ruby>などに置換しやすいようにしている。

---
title: 論文タイトル
subtitle: サブタイトル
author: 執筆者名
date: 日付
header-includes: |

abstract: This is a pandoc test . . .
---


<!-- 書き方メモ
- 強調  *強調したい文字* ゴシックになる程度
- ルビ  rb{山|﨑}{やま|さき}rb
- 圏点  ten{傍点をつけたい語句}ten
- 下線 ul{下線をつけたい文字}ul
- 波線 uw{波線をつけたい文字}uw
- 囲み文字 k{囲みたい文字}k
- 引用 > 
- 画像 ![キャプション](pic/001.jpg){width=10cm}
- 脚注 本文につける[^1]   [^1]:脚注を書く
- 見出しに章番号をつけたくない時  # 見出し{-}
-->

# はじめに

# 教育の目的

以下、福沢諭吉の「教育の目的」より。


>  ul{教育の目的は}ul、人生を発達して極度に導くにあり。そのこれを導くは何のためにするやと尋ぬれば、uw{人類をして至大の幸福を得せしめんがためなり}uw。そのrb{至|大}{し|だい}rbの幸福とは何ぞや。ここに文字の義を細かに論ぜずして民間普通の語を用うれば、天下泰平・家内安全、すなわちこれなり。今この語の二字を取りて、かりにこれをk{平安の主義}kと名づく。人として平安を好むは、これをその天性というべきか、はた習慣というべきか。余は宗教の天然説を度外視する者なれば、天の約束というも、rb{人為}{じんい}rbの習慣というも、そのへんはこれをrb{人々}{にんにん}rbの所見にまかして問うことなしといえども、ただ平安を好むの一事にいたりては、古今人間の実際に行われてrb{違}{たが}rbうことなきを知るべきのみ。しからばすなわちten{教育の目的は平安にあり}tenというも、世界人類の社会に通用してrb{妨}{さまたげ}rbあることなかるべし。

>  そもそも今日の社会に、いわゆる宗旨なり、徳教なり、政治なり、経済なり、その所論おのおのrb{趣}{おもむき}rbを一にせずして、はなはだしきはrb{相互}{あいたがい}rbにrb{背|馳}{はい|ち}rbするものもあるに似たれども、平安の一義にいたりてはrb{相違}{あいたが}rbうなきを見るべし。宗旨・徳教、何のためにするや。善を勧めて精神の平安をいたすのみ。*政治、何のためにするや。悪をrb{懲}{こ}rbらし害を防ぎて、もって心身の平安を助くるのみ。*経済、何のためにするや。人工を便利にして形体の平安を増すのみ。されば平安の主義は人生の達するところ、教育のとどまるところというも、はたして真実|rb{無|妄}{む|もう}rbなるを知るべし。


以上、青空文庫より[^1]。

[^1]:著作権の消滅した作品が読める。http://www.aozora.gr.jp/

表の作成は、このサイト(http://www.tablesgenerator.com/markdown_tables)を利用するのが便利。というか、このサイトがないと、表を作る気がしない。

Table:表の例

| Tables   |      Are      |  Cool |
|----------|:-------------:|------:|
| col 1 is |  left-aligned | $1600 |
| col 2 is |    centered   |   $12 |
| col 3 is | right-aligned |    $1 |

![画像のキャプション](pic/test.jpg){width=5cm}

スクリプト実行

端末(ターミナル)で以下を実行。Lualatex経由なので、処理に時間がかかるけど、じっと我慢していると、PDFが作成される。

$ sh makepaper.sh 原稿

サンプル画像

f:id:adbird:20180131205538p:plain

Geany エラー対処

少し前からGeanyエディタ(on Ubuntu14.04)が、「Unix ドメイン・ソケット〜」というようなエラーが出て、起動できなくなっていた。

しばらく別のエディタを使っていたけど、やはりGeanyの「ビルドコマンドの設定」が便利すぎて(一度、コマンドを登録しておけば、ボタン一つクリックするだけで実行してくれるので、いちいち端末〔ターミナル〕を開かなくていい)、その便利さが忘れられず、ちゃんと解決方法を探してみた。

すると、下記参考リンクにあった解決方法で無事、Geanyが起動してくれた。

解決方法。 下記のファイルを削除するだけだった。

~/.config/geany/geany_socket_*

参考リンク:

text editor - sudo geany throws fatal error - Ask Ubuntu