2020-12-21 13:12:05 +01:00
# How to build Gtk4 Tutorial
2021-01-11 15:32:09 +01:00
## Prerequisites
2020-12-21 13:12:05 +01:00
2021-01-11 15:32:09 +01:00
- To clone the repository, git is necessary. Most distribution has its package.
- Ruby and rake.
- To generate html and latex files, pandoc is necessary.
- To make pdf, latex system is necessary. Texlive2020 or later version is recommended.
## Clone the repository
type the following command.
$ git clone https://github.com/ToshioCP/Gtk4-tutorial.git
## Github flavored markdown
When you see [gtk4_tutorial github page ](https://github.com/ToshioCP/Gtk4-tutorial ), you'll find `Readme.md` contents below the list of files.
This file is written in markdown language, of which the file has `.md` suffix.
There are several kinds of markdown language.
`Readme.md` uses 'github flavored markdown', which is often shortened as GFM.
Markdown files in the top directory also written in GFM.
2021-02-08 14:24:54 +01:00
If you are not familiar with it, refer the website [github flavor markdown spec ](https://github.github.com/gfm/ ).
2020-12-21 13:12:05 +01:00
2021-01-11 15:32:09 +01:00
## Pandoc's markdown
This tutorial uses another markdown -- pandoc's markdown.
Pandoc is a converter between markdown, html, latex, word docx and so on.
This type of markdown is used to generate html and latex files in this tutorial.
2020-12-21 13:12:05 +01:00
2021-01-13 05:29:35 +01:00
## Src.md file
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
Src.md is similar to markdown but it has a command which isn't included in markdown syntax.
It is @@@ command.
The command starts at a line begins with "@@@" and ends at a line begins with "@@@".
For example,
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
~~~
@@@include
tfeapplication.c
@@@
~~~
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
There are three types of @@@ command.
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
### @@@include
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
This type of @@@ command starts with a line begins "@@@include".
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
~~~
@@@include
tfeapplication.c
@@@
~~~
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
This command replaces itself with the text read from the C source file.
If a function list follows the filename, only the functions in the C source file are read.
If no function list is given, the command can read any text files even it is not C source file.
~~~
@@@include
tfeapplication.c main startup
@@@
~~~
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
~~~
@@@include
lib_src2md.rb
@@@
~~~
2020-12-21 13:12:05 +01:00
2021-03-03 15:45:54 +01:00
The inserted text is converted to fence code block.
If the target markdown is GFM, then an info string follows the beginning fence.
The following example shows the command includes a C source file "sample.c".
2020-12-21 13:12:05 +01:00
2021-03-03 15:45:54 +01:00
$ cat src/sample.c
int
main (int argc, char **argv) {
... ...
}
$cat src/sample.src.md
... ...
@@@include -N
sample.c
@@@
... ...
$ ruby src2md.rb src/sample.src.md gfm/sample.md
$ cat gfm/sample.md
... ...
2021-02-08 14:24:54 +01:00
~~~C
int
main (int argc, char **argv) {
... ...
}
~~~
2021-03-03 15:45:54 +01:00
... ...
2020-12-21 13:12:05 +01:00
2021-03-03 15:45:54 +01:00
Info strings are usually language like C, ruby, xml and so on.
2021-02-08 14:24:54 +01:00
This string is decided with the filename extension.
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
A line number is inserted at the top of each line in the code block.
If you don't want to insert it, give "-N" option to @@@include command.
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
Options:
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
- "-n": Inserts a line number at the top of each line (default).
- "-N": No line number is inserted.
2020-12-21 13:12:05 +01:00
2021-03-03 15:45:54 +01:00
$cat src/sample.src.md
... ...
@@@include
sample.c
@@@
... ...
$ ruby src2md.rb src/sample.src.md gfm/sample.md
$ cat gfm/sample.md
... ...
~~~C
1 int
2 main (int argc, char **argv) {
... ...
14 }
~~~
... ...
If the target markdown is an intermediate file to html, then another type of info string follows the beginning fence.
If @@@include command doesn't have -N option, then the generated markdown is:
~~~{.C .numberLines}
int
main (int argc, char **argv) {
... ...
}
~~~
The info string `.C` specifies C language.
The info string `.numberLines` is a class of the pandoc markdown.
If the class is given, pandoc generates CSS to insert line numbers to the source code in the html file.
That's why the fence code block in the markdown doesn't have line numbers, which is different from gfm markdown.
If "-N" option is given, then the info string is `{.C}` only.
If the target markdown is an intermediate file to latex, then an info string follows the beginning fence.
~~~{.C .numberLines}
int
main (int argc, char **argv) {
... ...
}
~~~
Rake uses pandoc with --listings option when it converts markdown to latex.
The generated latex file uses listings package to list source files instead of verbatim environment.
The markdwon above is converted to the following latex source file.
\begin{lstlisting}[language=C, numbers=left]
int
main (int argc, char **argv) {
... ...
}
\end{lstlisting}
Listing package can color or emphasize keywords, strings, comments and directives.
But it doesn't analyze the syntax or token of the language, so the kind of emphasis target is limited.
@@@include command have two advantages.
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
1. Less typing.
2. You don't need to modify your src.md file, even if the C source file is modified.
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
### @@@shell
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
This type of @@@ command starts with a line begins "@@@shell".
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
~~~
@@@shell
shell command
... ...
@@@
~~~
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
This command replaces itself with:
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
- the shell command
- the standard output from the shell command
For example,
~~~
@@@shell
wc Rakefile
@@@
~~~
This is converted to:
~~~
$ wc Rakefile
164 475 4971 Rakefile
~~~
### @@@if series
This type of @@@ command starts with a line begins "@@@if", "@@@elif", "@@@else" or "@@@end".
This command is similar to "#if", "#elif", #else " and "#end" directives in C preprocessor.
For example,
~~~
@@@if gfm
Refer to [tfetextview API reference ](tfetextview/tfetextview_doc.md )
@@@elif html
Refer to [tfetextview API reference ](tfetextview_doc.html )
@@@elif latex
Refer to tfetextview API reference in appendix.
@@@end
~~~
Conditions follow "@@@if" or "@@@elif".
They are "gfm", "html" or "latex" so far.
Other words or expressions may be available in the future version.
## Conversion
2021-02-09 10:16:52 +01:00
The @@@ commands are carried out by `src2md.rb` .
In addition, some conversion is made by `src2md.rb` .
2021-02-08 14:24:54 +01:00
- Relative links are changed according to the change of base directory.
2021-02-09 10:16:52 +01:00
- Size option in image link is removed when the destination is GFM or html.
- Relative link is removed when the destination is latex.
2021-02-08 14:24:54 +01:00
- Lines in fence code block are folded when the destination is latex.
2020-12-21 13:12:05 +01:00
2021-02-09 10:16:52 +01:00
There's a method `src2md` in the `lib/lib_src2md.rb` .
2020-12-21 13:12:05 +01:00
This method converts src.md file into md file.
2021-02-09 10:16:52 +01:00
The script `src2md.rb` just invokes this method.
In the same way, the method is called in the action in `Rakefile` .
The code analyzing @@@if series command in the method is rather complicated.
It is based on the state diagram below.
![state diagram ](../image/state_diagram.png )
2020-12-21 13:12:05 +01:00
2021-03-03 15:45:54 +01:00
## mktbl.rb script
The script "mktbl.rb" is in `src` directory.
This script makes a table easy to read.
For example, a text file "sample.md" has a table like this:
~~~
Price list
@@@table
|item|price|
|:-:|:-:|
|mouse|$10|
|PC|$500|
@@@
~~~
Run the script.
~~~
$ ruby mktbl.rb sample.md
~~~
Then, the file is changed to:
~~~
Price list
|item |price|
|:---:|:---:|
|mouse| $10 |
| PC |$500 |
~~~
The script makes a backup file "sample.md.bak".
The task of the script seems easy, but the program is not so simple.
The script "mktbl.rb" uses a library script "lib/lib\_mktbl.rb"
This script is independent from "src2md.rb".
2020-12-21 13:12:05 +01:00
## Directory structure
2021-01-14 02:02:41 +01:00
There are six directories under `gtk4_tutorial` directory.
They are `gfm` , `src` , `image` , `html` , `latex` and `lib` .
2021-02-08 14:24:54 +01:00
Three directories `gfm` , `html` and `latex` are the destination directories for GFM, html and latex files respectively.
2021-01-14 02:02:41 +01:00
It is possible that these three directories don't exist before the conversion.
2020-12-21 13:12:05 +01:00
2021-01-13 12:33:33 +01:00
- src: This directory contains src.md files and C-related source files.
- image: This directory contains image files like png or jpg.
2021-01-14 02:02:41 +01:00
- gfm: This directory is empty at first. A ruby script will convert src.md files to GFM files and store them in this directory.
2021-01-13 12:33:33 +01:00
- html: This directory is empty at first. A ruby script will convert src.md files to html files and store them in this directory.
2021-02-08 14:24:54 +01:00
- latex: This directory is empty at first. A ruby script will convert src.md files to latex files and store them in this directory.
2021-01-13 12:33:33 +01:00
- lib: This directory includes ruby library files.
2020-12-21 13:12:05 +01:00
2021-01-13 05:29:35 +01:00
## Src and top directories
2020-12-21 13:12:05 +01:00
2021-01-09 07:35:06 +01:00
Src directory contains src.md files and C-related source files.
2021-01-14 02:02:41 +01:00
The top directory, which is gtk\_tutorial directory, contains `Rakefile` , `Readme_for_developers.md` and some other files.
`Readme.md` is generated and located at the top directory by rake.
`Readme.md` has title, abstract, table of contents and links to GFM files,
which rake also generates under `gfm` directory.
2020-12-21 13:12:05 +01:00
2021-01-11 15:32:09 +01:00
$ rake
2021-01-14 02:02:41 +01:00
Rakefile describes how to convert src.md files into GFM files.
2021-01-11 15:32:09 +01:00
Rake carries out the conversion according to the instruction written in Rakefile.
2021-01-13 05:29:35 +01:00
## The name of files in src directory
2020-12-21 13:12:05 +01:00
2021-02-08 14:24:54 +01:00
Each file in src directory is an abstract or section of the whole document.
The name of the abstract file is "abstract.src.md".
The name of the section files are "sec", number of the section and ".src.md" suffix.
2020-12-21 13:12:05 +01:00
For example, "sec1.src.md", "sec5.src.md" or "sec12.src.md".
They are the files correspond to section 1, section 5 and section 12 respectively.
2021-01-13 05:29:35 +01:00
## C source file directory
2020-12-21 13:12:05 +01:00
Src.md files might have @@@ commands and they include C source files.
Such C source files are located in the src directory or its subdirectories.
Usually, those C files are compiled and tested.
At that time, some auxiliary files and target file like a.out are generated.
If you locate the C source files under src directory, those temporary files make the directory messy.
Therefore, It is a good idea to make subdirectories under src directory and put each C source file under the corresponding subdirectory.
The name of the subdirectories should be independent of section names.
It is because of renumbering, which will be explained in the next subsection.
2021-01-13 05:29:35 +01:00
## Renumbering
2020-12-21 13:12:05 +01:00
Sometimes you want to insert a section.
For example, inserting it between section 4 and section 5.
You can make a temporary section 4.5, that is a rational number between 4 and 5.
2021-01-11 15:32:09 +01:00
However, section numbers are usually integer so it must change to section 5 and the numbers of following sections also must be added by one.
2020-12-21 13:12:05 +01:00
2021-01-11 15:32:09 +01:00
This renumbering is done by a method `renum` of the class `Sec_files` .
2020-12-21 13:12:05 +01:00
- It changes file names.
- If there are references to sections in src.md files, the section numbers will be automatically renumbered.
## Rakefile
2021-01-09 07:35:06 +01:00
Rakefile is a similar file to Makefile but controlled by rake, which is a make-like program written in ruby.
2020-12-21 13:12:05 +01:00
Rakefile has the following tasks.
2021-01-14 02:02:41 +01:00
- md: generate GFM markdown files. This is the default.
2020-12-21 13:12:05 +01:00
- html: generate html files.
2021-01-11 15:32:09 +01:00
- pdf: generate latex files and a pdf file, which is generated by pdflatex.
- latex: generate latex files.
2020-12-21 13:12:05 +01:00
- all: generate md, html, latex and pdf files.
2021-01-11 15:32:09 +01:00
Rake does renumbering before the tasks above.
2020-12-21 13:12:05 +01:00
2021-01-14 02:02:41 +01:00
## Generate GFM markdown files
2021-01-09 07:35:06 +01:00
2021-01-11 15:32:09 +01:00
Markdown files (GFM) are generated by rake.
2021-01-09 07:35:06 +01:00
$ rake
2021-01-14 02:02:41 +01:00
This command generates `Readme.md` , which has no original src.md file.
At the same time, it converts each .src.md file into GFM file under `gfm` directory.
2021-01-09 07:35:06 +01:00
When translated, it is added a navigation line at the top and bottom.
2021-01-11 15:32:09 +01:00
You can describe width and height of images in .src.md files.
For example,
![sample image ](../image/sample_image.png ){width=10cm height=6cm}
2021-02-08 14:24:54 +01:00
The size between left brace and right brace is used in latex file and it is not fit to GFM syntax.
2021-01-14 02:02:41 +01:00
So the size is removed in the conversion above.
If a src.md file has relative URL link, it will be changed by conversion.
Because src.md files are located under `src` directory and GFM files are located under `gfm` directory, base URL of GFM files is different from base URL of src.md files.
For example, `[Sample.c](sample.c)` is translated to `[Sample.c](../src/sample.c)` .
If a link points another src.md file, then the target filename will be changed to .md file.
For example, `[Section 5](sec5.src.md)` is translated to `[Section 5](sec5.md)` .
2021-01-11 15:32:09 +01:00
2021-01-09 07:35:06 +01:00
If you want to clean the directory, that means remove all the generated markdown files, type `rake clean` .
$ rake clean
2021-01-14 02:02:41 +01:00
If you see the github repository (ToshioCP/Gtk4-tutorial), `Readme.md` is shown below the list of the top directory.
2021-01-09 07:35:06 +01:00
And `Readme.md` includes links to each markdown files.
2021-01-14 02:02:41 +01:00
The repository not only stores source files but also shows the tutorial in it.
2021-01-09 07:35:06 +01:00
2021-01-13 05:29:35 +01:00
## Generate html files
2021-01-09 07:35:06 +01:00
Src.md files can be translated to html files.
You need pandoc to do this.
Most linux distribution has pandoc package.
Refer to your distribution document to install it.
Type `rake html` to generate html files.
$ rake html
2021-01-11 15:32:09 +01:00
First, it generates pandoc's markdown files under `html` directory.
2021-01-13 12:33:33 +01:00
Then, pandoc converts them to html files.
2021-01-11 15:32:09 +01:00
The description of the width and height of image files is removed.
2021-01-09 07:35:06 +01:00
`index.html` is the top html file.
If you want to clean `html` directory, type `rake cleanhtml`
$ rake cleanhtml
Every html file has stylesheet in its header.
This comes from `header` string in `Rakefile` .
You can customize the style by modifying `Rakefile` .
2021-01-13 05:29:35 +01:00
## Generate latex files and a pdf file
2021-01-11 15:32:09 +01:00
Src.md files can be translated to latex files.
You need pandoc to do this.
Type `rake latex` to generate latex files.
$ rake latex
First, it generates pandoc's markdown files under `latex` directory.
2021-01-13 12:33:33 +01:00
Then, pandoc converts them to latex files.
2021-01-11 15:32:09 +01:00
Links to files or directories are removed because latex doesn't support them.
However, links to full URL are kept.
`main.tex` is the top latex file.
If you want to clean `latex` directory, type `rake cleanlatex`
$ rake cleanlatex
You can customize `main.tex` and `helper.tex` , which describes preamble, by modifying `Rakefile` .
You can generate pdf file by typing `rake pdf` .
$ rake pdf