Initial commit

This commit is contained in:
2025-06-18 22:17:59 +09:00
commit 09936da755
51 changed files with 2210 additions and 0 deletions

310
.gitignore vendored Normal file
View File

@@ -0,0 +1,310 @@
# ---> TeX
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
*.lzo
*.lzs
*.slg
*.slo
*.sls
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
# *.ist
# gnuplot
*.gnuplot
*.table
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.glog
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
# *.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# newpax
*.newpax
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# svg
svg-inkscape/
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# titletoc
*.ptc
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices and outlines
*.xyc
*.xyd
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# gummi
.*.swp
# KBibTeX
*~[0-9]*
# TeXnicCenter
*.tps
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
# Makeindex log files
*.lpz
# xwatermark package
*.xwm
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
# Uncomment the next line to have this generated file ignored.
#*Notes.bib
# test output of template
out-temp/
# output from pandoc md -> tex
md-out/

184
LICENSE Normal file
View File

@@ -0,0 +1,184 @@
The LaTeX Project Public License
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
LPPL Version 1.3c 2008-05-04
Copyright 1999 2002-2008 LaTeX3 Project
Everyone is allowed to distribute verbatim copies of this license document, but modification of it is not allowed.
PREAMBLE
========
The LaTeX Project Public License (LPPL) is the primary license under which the LaTeX kernel and the base LaTeX packages are distributed.
You may use this license for any work of which you hold the copyright and which you wish to distribute. This license may be particularly suitable if your work is TeX-related (such as a LaTeX package), but it is written in such a way that you can use it even if your work is unrelated to TeX.
The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', below, gives instructions, examples, and recommendations for authors who are considering distributing their works under this license.
This license gives conditions under which a work may be distributed and modified, as well as conditions under which modified versions of that work may be distributed.
We, the LaTeX3 Project, believe that the conditions below give you the freedom to make and distribute modified versions of your work that conform with whatever technical specifications you wish while maintaining the availability, integrity, and reliability of that work. If you do not see how to achieve your goal while meeting these conditions, then read the document `cfgguide.tex' and `modguide.tex' in the base LaTeX distribution for suggestions.
DEFINITIONS
===========
In this license document the following terms are used:
`Work' Any work being distributed under this License. `Derived Work' Any work that under any applicable law is derived from the Work.
`Modification' Any procedure that produces a Derived Work under any applicable law -- for example, the production of a file containing an original file associated with the Work or a significant portion of such a file, either verbatim or with modifications and/or translated into another language.
`Modify' To apply any procedure that produces a Derived Work under any applicable law. `Distribution' Making copies of the Work available from one person to another, in whole or in part. Distribution includes (but is not limited to) making any electronic components of the Work accessible by file transfer protocols such as FTP or HTTP or by shared file systems such as Sun's Network File System (NFS).
`Compiled Work' A version of the Work that has been processed into a form where it is directly usable on a computer system. This processing may include using installation facilities provided by the Work, transformations of the Work, copying of components of the Work, or other activities. Note that modification of any installation facilities provided by the Work constitutes modification of the Work.
`Current Maintainer' A person or persons nominated as such within the Work. If there is no such explicit nomination then it is the `Copyright Holder' under any applicable law.
`Base Interpreter' A program or process that is normally needed for running or interpreting a part or the whole of the Work.
A Base Interpreter may depend on external components but these are not considered part of the Base Interpreter provided that each external component clearly identifies itself whenever it is used interactively. Unless explicitly specified when applying the license to the Work, the only applicable Base Interpreter is a `LaTeX-Format' or in the case of files belonging to the `LaTeX-format' a program implementing the `TeX language'.
CONDITIONS ON DISTRIBUTION AND MODIFICATION
===========================================
1. Activities other than distribution and/or modification of the Work are not covered by this license; they are outside its scope. In particular, the act of running the Work is not restricted and no requirements are made concerning any offers of support for the Work.
2. You may distribute a complete, unmodified copy of the Work as you received it. Distribution of only part of the Work is considered modification of the Work, and no right to distribute such a Derived Work may be assumed under the terms of this clause.
3. You may distribute a Compiled Work that has been generated from a complete, unmodified copy of the Work as distributed under Clause 2 above, as long as that Compiled Work is distributed in such a way that the recipients may install the Compiled Work on their system exactly as it would have been installed if they generated a Compiled Work directly from the Work.
4. If you are the Current Maintainer of the Work, you may, without restriction, modify the Work, thus creating a Derived Work. You may also distribute the Derived Work without restriction, including Compiled Works generated from the Derived Work. Derived Works distributed in this manner by the Current Maintainer are considered to be updated versions of the Work.
5. If you are not the Current Maintainer of the Work, you may modify your copy of the Work, thus creating a Derived Work based on the Work, and compile this Derived Work, thus creating a Compiled Work based on the Derived Work.
6. If you are not the Current Maintainer of the Work, you may distribute a Derived Work provided the following conditions are met for every component of the Work unless that component clearly states in the copyright notice that it is exempt from that condition. Only the Current Maintainer is allowed to add such statements of exemption to a component of the Work.
a. If a component of this Derived Work can be a direct replacement for a component of the Work when that component is used with the Base Interpreter, then, wherever this component of the Work identifies itself to the user when used interactively with that Base Interpreter, the replacement component of this Derived Work clearly and unambiguously identifies itself as a modified version of this component to the user when used interactively with that Base Interpreter.
b. Every component of the Derived Work contains prominent notices detailing the nature of the changes to that component, or a prominent reference to another file that is distributed as part of the Derived Work and that contains a complete and accurate log of the changes.
c. No information in the Derived Work implies that any persons, including (but not limited to) the authors of the original version of the Work, provide any support, including (but not limited to) the reporting and handling of errors, to recipients of the Derived Work unless those persons have stated explicitly that they do provide such support for the Derived Work.
d. You distribute at least one of the following with the Derived Work:
1. A complete, unmodified copy of the Work; if your distribution of a modified component is made by offering access to copy the modified component from a designated place, then offering equivalent access to copy the Work from the same or some similar place meets this condition, even though third parties are not compelled to copy the Work along with the modified component;
2. Information that is sufficient to obtain a complete, unmodified copy of the Work.
7. If you are not the Current Maintainer of the Work, you may distribute a Compiled Work generated from a Derived Work, as long as the Derived Work is distributed to all recipients of the Compiled Work, and as long as the conditions of Clause 6, above, are met with regard to the Derived Work.
8. The conditions above are not intended to prohibit, and hence do not apply to, the modification, by any method, of any component so that it becomes identical to an updated version of that component of the Work as it is distributed by the Current Maintainer under Clause 4, above.
9. Distribution of the Work or any Derived Work in an alternative format, where the Work or that Derived Work (in whole or in part) is then produced by applying some process to that format, does not relax or nullify any sections of this license as they pertain to the results of applying that process.
10.
a. A Derived Work may be distributed under a different license provided that license itself honors the conditions listed in Clause 6 above, in regard to the Work, though it does not have to honor the rest of the conditions in this license.
b. If a Derived Work is distributed under a different license, that Derived Work must provide sufficient documentation as part of itself to allow each recipient of that Derived Work to honor the restrictions in Clause 6 above, concerning changes from the Work.
11. This license places no restrictions on works that are unrelated to the Work, nor does this license place any restrictions on aggregating such works with the Work by any means.
12. Nothing in this license is intended to, or may be used to, prevent complete compliance by all parties with all applicable laws.
NO WARRANTY
===========
There is no warranty for the Work. Except when otherwise stated in writing, the Copyright Holder provides the Work `as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the Work is with you. Should the Work prove defective, you assume the cost of all necessary servicing, repair, or correction.
In no event unless required by applicable law or agreed to in writing will The Copyright Holder, or any author named in the components of the Work, or any other party who may distribute and/or modify the Work as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of the Work or out of inability to use the Work (including, but not limited to, loss of data, data being rendered inaccurate, or losses sustained by anyone as a result of any failure of the Work to operate with any other programs), even if the Copyright Holder or said author or said other party has been advised of the possibility of such damages.
MAINTENANCE OF THE WORK
=======================
The Work has the status `author-maintained' if the Copyright Holder explicitly and prominently states near the primary copyright notice in the Work that the Work can only be maintained by the Copyright Holder or simply that it is `author-maintained'.
The Work has the status `maintained' if there is a Current Maintainer who has indicated in the Work that they are willing to receive error reports for the Work (for example, by supplying a valid e-mail address). It is not required for the Current Maintainer to acknowledge or act upon these error reports.
The Work changes from status `maintained' to `unmaintained' if there is no Current Maintainer, or the person stated to be Current Maintainer of the work cannot be reached through the indicated means of communication for a period of six months, and there are no other significant signs of active maintenance.
You can become the Current Maintainer of the Work by agreement with any existing Current Maintainer to take over this role.
If the Work is unmaintained, you can become the Current Maintainer of the Work through the following steps:
1. Make a reasonable attempt to trace the Current Maintainer (and the Copyright Holder, if the two differ) through the means of an Internet or similar search.
2. If this search is successful, then enquire whether the Work is still maintained.
a. If it is being maintained, then ask the Current Maintainer to update their communication data within one month.
b. If the search is unsuccessful or no action to resume active maintenance is taken by the Current Maintainer, then announce within the pertinent community your intention to take over maintenance. (If the Work is a LaTeX work, this could be done, for example, by posting to comp.text.tex.)
3a. If the Current Maintainer is reachable and agrees to pass maintenance of the Work to you, then this takes effect immediately upon announcement.
b. If the Current Maintainer is not reachable and the Copyright Holder agrees that maintenance of the Work be passed to you, then this takes effect immediately upon announcement.
4. If you make an `intention announcement' as described in 2b. above and after three months your intention is challenged neither by the Current Maintainer nor by the Copyright Holder nor by other people, then you may arrange for the Work to be changed so as to name you as the (new) Current Maintainer.
5. If the previously unreachable Current Maintainer becomes reachable once more within three months of a change completed under the terms of 3b) or 4), then that Current Maintainer must become or remain the Current Maintainer upon request provided they then update their communication data within one month.
A change in the Current Maintainer does not, of itself, alter the fact that the Work is distributed under the LPPL license.
If you become the Current Maintainer of the Work, you should immediately provide, within the Work, a prominent and unambiguous statement of your status as Current Maintainer. You should also announce your new status to the same pertinent community as in 2b) above.
WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
======================================================
This section contains important instructions, examples, and recommendations for authors who are considering distributing their works under this license. These authors are addressed as `you' in this section.
Choosing This License or Another License
----------------------------------------
If for any part of your work you want or need to use *distribution* conditions that differ significantly from those in this license, then do not refer to this license anywhere in your work but, instead, distribute your work under a different license. You may use the text of this license as a model for your own license, but your license should not refer to the LPPL or otherwise give the impression that your work is distributed under the LPPL.
The document `modguide.tex' in the base LaTeX distribution explains the motivation behind the conditions of this license. It explains, for example, why distributing LaTeX under the GNU General Public License (GPL) was considered inappropriate. Even if your work is unrelated to LaTeX, the discussion in `modguide.tex' may still be relevant, and authors intending to distribute their works under any license are encouraged to read it.
A Recommendation on Modification Without Distribution
-----------------------------------------------------
It is wise never to modify a component of the Work, even for your own personal use, without also meeting the above conditions for distributing the modified component. While you might intend that such modifications will never be distributed, often this will happen by accident -- you may forget that you have modified that component; or it may not occur to you when allowing others to access the modified version that you are thus distributing it and violating the conditions of this license in ways that could have legal implications and, worse, cause problems for the community. It is therefore usually in your best interest to keep your copy of the Work identical with the public one. Many works provide ways to control the behavior of that work without altering any of its licensed components.
How to Use This License
-----------------------
To use this license, place in each of the components of your work both an explicit copyright notice including your name and the year the work was authored and/or last substantially modified. Include also a statement that the distribution and/or modification of that component is constrained by the conditions in this license.
Here is an example of such a notice and statement:
%% pig.dtx
%% Copyright 2005 M. Y. Name
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is M. Y. Name.
%
% This work consists of the files pig.dtx and pig.ins
% and the derived file pig.sty.
Given such a notice and statement in a file, the conditions given in this license document would apply, with the `Work' referring to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' referring to any `LaTeX-Format', and both `Copyright Holder' and `Current Maintainer' referring to the person `M. Y. Name'.
If you do not want the Maintenance section of LPPL to apply to your Work, change `maintained' above into `author-maintained'. However, we recommend that you use `maintained', as the Maintenance section was added in order to ensure that your Work remains useful to the community even when you can no longer maintain and support it yourself.
Derived Works That Are Not Replacements
---------------------------------------
Several clauses of the LPPL specify means to provide reliability and stability for the user community. They therefore concern themselves with the case that a Derived Work is intended to be used as a (compatible or incompatible) replacement of the original Work. If this is not the case (e.g., if a few lines of code are reused for a completely different task), then clauses 6b and 6d shall not apply.
Important Recommendations
-------------------------
Defining What Constitutes the Work
The LPPL requires that distributions of the Work contain all the files of the Work. It is therefore important that you provide a way for the licensee to determine which files constitute the Work. This could, for example, be achieved by explicitly listing all the files of the Work near the copyright notice of each file or by using a line such as:
% This work consists of all files listed in manifest.txt.
in that place. In the absence of an unequivocal list it might be impossible for the licensee to determine what is considered by you to comprise the Work and, in such a case, the licensee would be entitled to make reasonable conjectures as to which files comprise the Work.

64
Makefile Normal file
View File

@@ -0,0 +1,64 @@
NAME := main
RM := rm
TEX := lualatex
BIB := biber
PANDOC := pandoc
LUA := lualatex --luaonly
OUTDIR=./output
TEXFLAGS := --interaction=nonstopmode --output-directory=$(OUTDIR)/
BIBFLAGS := --input-directory=$(OUTDIR) --output-directory=$(OUTDIR)/
PRINTFORMAT := "\033[1;92;49m%s\033[m\n"
USE_MARKDOWN := true
MARKDOWNS := $(wildcard markdown/*.md)
MARKDOWN_OUTPUTS := $(patsubst markdown/%.md,md-out/%.tex,$(MARKDOWNS))
BIBFILE := references.bib
MAIN := $(addsuffix .tex,${NAME})
.PHONY: ${MAIN} clean
all: ${MAIN}
generate:
${LUA} script/generate-main.lua > main.tex
md-out/%.tex: markdown/%.md
ifeq ($(USE_MARKDOWN),true)
mkdir -p md-out
${PANDOC} -f gfm $< -t latex -o $@
else
@printf ${PRINTFORMAT} "[$@: No markdown output]"
endif
single:
${TEX} ${TEXFLAGS} ./${NAME}.tex
bib:
${BIB} ${BIBFLAGS} ${NAME}
optimize:
qpdf --linearize output/${NAME}.pdf output/${NAME}-opt.pdf
qpdf --optimize-images output/${NAME}-opt.pdf output/${NAME}-opt-final.pdf
rm output/${NAME}-opt.pdf
output/${NAME}.bcf: ${BIBFILE}
@mkdir -p $(OUTDIR)
@printf ${PRINTFORMAT} "[$@: Generating Bibliography Contexts]"
-${TEX} ${TEXFLAGS} ./${NAME}.tex
@printf ${PRINTFORMAT} "[$@: Building Bibliography Auxiliary File]"
${BIB} ${BIBFLAGS} ${NAME}
@printf ${PRINTFORMAT} "[$@: Linking Indexes and Contexts]"
-${TEX} ${TEXFLAGS} ./${NAME}.tex
${MAIN}: $(MARKDOWN_OUTPUTS) output/${NAME}.bcf
@mkdir -p $(OUTDIR)
@printf ${PRINTFORMAT} "[$@: Building Output]"
${TEX} ${TEXFLAGS} ./${NAME}.tex
clean:
${RM} ./output/{*.aux,*.log,*.out,*.blg,*.bcf,*.bbl,*.xml}
${RM} -dr ./md-out

2
README.md Normal file
View File

@@ -0,0 +1,2 @@
# CHANGEME

BIN
assets/fonts/Hack-Bold.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/school-symbol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

50
class/nitonepage.cls Normal file
View File

@@ -0,0 +1,50 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myonepage}[2025/05/07 My One Page Class]
\LoadClass[
lualatex,
a4paper,
article,
fontsize=11pt,
line_length=42zw,
jlreq_warnings
]{jlreq}
\RequirePackage{../packages/mybibs}
\RequirePackage{../packages/mycodelistings}
\RequirePackage{../packages/mygraphics}
\RequirePackage{../packages/myfonts}
\RequirePackage{../packages/mypagesetup}
\RequirePackage{../packages/mycommands}
\RequirePackage{ragged2e}
\DeclareOption{left-aligned-title}{\newenvironment{thealign}{\begin{FlushLeft}}{\end{FlushLeft}}}
\DeclareOption{center-aligned-title}{\newenvironment{thealign}{\begin{Center}}{\end{Center}}}
\DeclareOption{right-aligned-title}{\newenvironment{thealign}{\begin{FlushRight}}{\end{FlushRight}}}
\ProcessOptions\relax
\newcommand{\titleheading}{
\begin{thealign}
\Huge
{\rmfamily \getreporttitle}
\vspace{-8mm}
\normalsize
{\rmfamily \getreportdate}
{\rmfamily \getprofessor}
\end{thealign}
}
\RequirePackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\lhead{\getreportauthor (\getstudentid)}
\chead{\getschoolname}
\rhead{\getsubject}
\lfoot{\footnotesize Made With \LaTeX{} + vim}
\cfoot{}
\rfoot{\footnotesize \compiledTime}

78
class/nitreport.cls Normal file
View File

@@ -0,0 +1,78 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myreport}[2025/05/07 My Report Class]
\LoadClass[
lualatex,
a4paper,
article,
fontsize=11pt,
line_length=42zw,
jlreq_warnings
]{jlreq}
\RequirePackage{../packages/mybibs}
\RequirePackage{../packages/mycodelistings}
\RequirePackage{../packages/mygraphics}
\RequirePackage{../packages/myfonts}
\RequirePackage{../packages/mypagesetup}
\RequirePackage{../packages/mycommands}
\newcommand{\coverpage}{
\begin{titlepage}
\thispagestyle{empty}
\begin{center}
\vspace*{0.25cm}
\includegraphics[height=5cm]{./assets/school-symbol.png}
\vspace{1cm}
\Huge
{\getschoolname}
\vspace{0.75cm}
\LARGE
{\getreporttitle}
\vspace{0.5cm}
\large
{\getdepartment : \getsubject}
{\getprofessor}
\vspace{0.5cm}
{\getreportauthor}
\vspace{-0.25cm}
{({\getstudentid} {\getseatingnum})}
\vfill
{\getturnindate}
{\getreportdate}
\vspace{0.25cm}
\end{center}
\begin{flushleft}
\footnotesize
Made with \LaTeX{} + vim
\end{flushleft}
\end{titlepage}
}
\RequirePackage{fancyhdr}
\pagestyle{fancy}
%\renewcommand{\headwidth}{240mm}
\fancyhf{}
\lhead{\@author}
\chead{\@title $-$ \leftmark}
\rhead{\@subject}
\lfoot{\footnotesize Made With \LaTeX{} + vim}
\cfoot{\thepage}
\rfoot{}

22
docs/CONTENTS.md Normal file
View File

@@ -0,0 +1,22 @@
# Project Contents
```
/ <Project ROOT>
|
|-assets/ <Project Assets>
| |-fonts/ <Project Fonts>
|-class/ <Report Classes>
|-docs/ <Template Documentations>
|-markdown/ <Markdown Sections>
|-nix/ <Project Nix Files>
|-packages/ <Custom LaTeX Packages>
|-script/ <Helper Scripts>
|-section/ <Project Sections>
|-Makefile <Project Makefile>
|-README.md <Project README>
|-document.yaml <Project Config>
|-flake.lock <Template Dependencies Lock file>
|-flake.nix <Template Nix Flake>
|-init.bash <Project Initializer>
|-references.bib <Project Bibliography>
```

21
docs/README.md Normal file
View File

@@ -0,0 +1,21 @@
# Quick Start
After installing Nix to your machine and enableing flakes, run following command:
```bash
nix develop
```
You can use wrapped vim(`vim-nit-latex`) to edit TeX files which includes vim-eskk plugins for flawless Japanese writting and some vim abbriviations.
This template uses YAML configuration file(`document.yaml`) to generate `main.tex`. (See [YAML_CONFIG.md](./YAML_CONFIG.md))
After configuration, generate `main.tex` with this command:
```bash
make generate
```
This will run `script/generate-main.lua`.
To compile into PDF, you can just run `make`.

153
docs/YAML_CONFIG.md Normal file
View File

@@ -0,0 +1,153 @@
# YAML Scheme for `document.yaml`
## `doc_class`
* Type: string, restricted
* Values: `nitreport || nitonepage`
* Description: Document class to use.
## `title`
* Type: string
* Description: Title of the paper.
## `author`
* Type: hash
* Description: Hash value containing name, student ID, and seating number.
### `author.name`
* Type: hash element, string
* Description: Name of author.
### `author.student_id`
* Type: hash element, string
* Description: Student ID of author.
### `author.seating_number`
* Type: hash element, string
* Description: Seating number of author.
## `date`
* Type: hash
* Description: Hash value containing date of creation. Displayed in "YMD" format.
### `date.year`
* Type: hash element, string
* Description: Year of creation.
### `date.month`
* Type: hash element, string
* Description: Month of creation.
### `date.day`
* Type: hash element, string
* Description: Day of creation.
## `turnin`
* Type: hash
* Description: Hash value containing date of turn-in. Displayed in "YMD" format.
### `turnin.year`
* Type: hash element, string
* Description: Year of turn-in.
### `turnin.month`
* Type: hash element, string
* Description: Month of turn-in.
### `turnin.day`
* Type: hash element, string
* Description: Day of turn-in.
## `school_name`
* Type: string
* Description: Name of belonging school.
## `department`
* Type: string
* Description: Name of belonging department.
## `subject`
* Type: string
* Description: Name of subject.
## `professor`
* Type: string
* Description: Name of conducting professor(s).
## `paper_config`
* Type: hash
* Description: Configurations for paper.
### `paper_config.include_cover_page`
* Type: hash element, boolean
* Description: Whether include cover page.
### `paper_config.include_table_of_contents`
* Type: hash element, boolean
* Description: Whether include table of contents.
### `paper_config.use_bib`
* Type: hash element, boolean
* Description: Whether using BibLaTeX.
### `paper_config.use_additional_packages`
* Type: hash element, boolean
* Description: Whether using additinal packages defined in `packages`. See `packages` for more information.
### `paper_config.show_compiled_time`
* Type: hash element, boolean
* Description: Whether show compiled time displayed in Unix time.
## `packages`
* Type: list of hash
* Description: List of additional packages with options
### `packages[].name`
* Type: hash element, string
* Description: Name of package
### `packages[].options`
* Type: hash element, string
* Description: Package options. Excluding brackets. Can be empty string.
## `sections`
* Type: list of hash
* Description: List of path to `.tex` files.
### `sections[].path`
* Type: hash element, string
* Description: Path to `.tex` file.
### `sections[].newpg`
* Type: hash element, boolean
* Description: Whether adding `\newpage` after `\input`.

36
document.yaml Normal file
View File

@@ -0,0 +1,36 @@
doc_class: nitreport
title: Insert Title Here
author:
name: 高専 太郎
student_id: 0000-01
seating_number: 1
date:
year: 令和7年
month: aa月
day: bb日
turnin:
year: 令和7年
month: cc月
day: dd日
school_name: abc高専
department: 一般科
subject: 〇〇概論
professor: □□教員
paper_config:
include_cover_page: true
include_table_of_contents: true
use_bib: false
use_additional_packages: false
show_compiled_time: true
# packages:
# - { name: "pkg", options: "options,inside,brackets" }
# - { name: "pkg-wo-opt", options: "" }
sections:
- { path: 'section/introduction.tex', newpg: true }
- { path: 'md-out/test.tex', newpg: false }

78
flake.lock generated Normal file
View File

@@ -0,0 +1,78 @@
{
"nodes": {
"eskk-vim": {
"flake": false,
"locked": {
"lastModified": 1717933058,
"narHash": "sha256-7nPzxCbKHBwplrTCsO4SxdFe/VK0VMHWDspWvVJvwLU=",
"owner": "vim-skk",
"repo": "eskk.vim",
"rev": "e530575790cca5d6603b8ab984298459ecf3c0c0",
"type": "github"
},
"original": {
"owner": "vim-skk",
"repo": "eskk.vim",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1747533086,
"narHash": "sha256-+8goyptSXa7qV0k5uPKyky58jpBjI/qkzsbwCZFvhRY=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "8406224e30c258025cb8b31704bdb977a8f1f009",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"eskk-vim": "eskk-vim",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

45
flake.nix Normal file
View File

@@ -0,0 +1,45 @@
{
description = "Nix flake for NIT LaTeX Report Env";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
eskk-vim = {
url = "github:vim-skk/eskk.vim";
flake = false;
};
};
outputs = inputs@{ self, flake-utils, nixpkgs, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
config = {};
overlays = import ./nix/overlay.nix { inherit (inputs)eskk-vim; };
};
lualibs = with pkgs.lua53Packages; [
lyaml
];
myvim = import ./nix/vim.nix { inherit pkgs; };
mytexlive = import ./nix/latex.nix { inherit pkgs; };
in
{
devShells.default = pkgs.stdenv.mkDerivation {
name = "LaTeX Environment";
shellHook = ''
export PS1="NIT Report \w \$ "
'';
nativeBuildInputs = [
mytexlive
myvim
pkgs.gnumake
pkgs.jq
pkgs.pandoc
pkgs.qpdf
pkgs.mermaid-cli
] ++ lualibs;
};
}
);
}

14
init.bash Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
[[ -f main.tex ]] && exit 0
reportName="$(basename "$PWD")"
replaceText="s/CHANGEME/$reportName/g"
lualatex --luaonly script/generate-main.lua
sed -i $replaceText README.md
desc_file=$(mktemp repo-description.XXXXXX)
$EDITOR $desc_file
cat $desc_file >> README.md
rm $desc_file

18
markdown/test.md Normal file
View File

@@ -0,0 +1,18 @@
# Hi
| x | y |
| --- | --- |
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
* i1
* i2
* i3
1. n1
2. n2
3. n3

48
nix/latex.nix Normal file
View File

@@ -0,0 +1,48 @@
{ pkgs }:
pkgs.texliveBasic.withPackages
(ps: [
ps.biber
ps.biblatex
ps.bibtex
ps.babel
ps.babel-japanese
ps.noto
ps.latexmk
ps.csquotes
ps.digestif
ps.import
ps.subfiles
ps.wrapfig
ps.collection-langjapanese
ps.amsmath
ps.amsfonts
ps.mathtools
ps.listings
ps.luatexja
ps.luainputenc
ps.lualatex-math
ps.unicode-math
ps.luacode
ps.enumitem
ps.latex-fonts
ps.hyperref
ps.graphics
ps.blindtext
ps.xcolor
ps.xpatch
ps.xstring
ps.float
ps.framed
ps.fontspec
ps.ninecolors
ps.here
ps.caption
ps.newtx
ps.tabularray
ps.fancyhdr
ps.fancybox
ps.fancyvrb
ps.ascmac
ps.ragged2e
ps.footmisc
])

16
nix/overlay.nix Normal file
View File

@@ -0,0 +1,16 @@
{ eskk-vim }:
[
(final: prev:
let
vim-eskk = prev.vimUtils.buildVimPlugin {
name = "vim-eskk";
src = eskk-vim;
};
in
{
vimPlugins = prev.vimPlugins // {
inherit vim-eskk;
};
}
)
]

79
nix/vim.nix Normal file
View File

@@ -0,0 +1,79 @@
{ pkgs, ... }:
pkgs.vim_configurable.customize {
name = "vim-nit-latex";
vimrcConfig.customRC = ''
filetype on
set encoding=utf-8
set autoindent
set smartindent
set shiftwidth=4
set tabstop=4
set smarttab
set expandtab
set wrap
syntax enable
set cursorline
set mousehide
set ruler
set number relativenumber
set nospell
set magic
set ignorecase
set smartcase
set hlsearch
set incsearch
let g:eskk#directory = "~/.config/eskk"
let g:eskk#dictionary = { 'path': "~/.config/eskk/jisyo", 'sorted': 1, 'encoding': 'utf-8', }
let g:eskk#large_dictionary = { 'path': "~/.config/eskk/SKK-JISYO.L", 'sorted': 1, 'encoding': 'euc-jp', }
let g:eskk#kakutei_when_unique_candidate = 0
let g:eskk#enable_completion = 0
let g:eskk#no_default_mappings = 1
let g:eskk#keep_state = 0
let g:eskk#egg_like_newline = 1
let g:toggle_latex_eskk = 1
function! s:latex_eskk() abort
if &filetype == 'tex' && g:toggle_latex_eskk ==# 1
call eskk#enable()
endif
endfunction
function! s:latex_eskk_toggle() abort
let g:toggle_latex_eskk = g:toggle_latex_eskk == 1 ? 0 : 1
if g:toggle_latex_eskk ==# 1
echomsg 'LaTeX Japanese Input Enabled'
else
echomsg 'LaTeX Japanese Input Disabled'
endif
endfunction
augroup vimrc_eskk
autocmd!
autocmd Filetype tex nnoremap <buffer><silent> <F1> :call <SID>latex_eskk_toggle()<CR>
autocmd User eskk-enable-post lmap <buffer> l <Plug>(eskk:disable)
augroup END
augroup latex_abbr
autocmd!
autocmd Filetype tex iabbrev <buffer> trm \textrm{}<Left>
autocmd Filetype tex iabbrev <buffer> tsf \textsf{}<Left>
autocmd Filetype tex iabbrev <buffer> ttt \texttt{}<Left>
autocmd Filetype tex iabbrev <buffer> tit \textit{}<Left>
autocmd Filetype tex iabbrev <buffer> tbf \textbf{}<Left>
autocmd Filetype tex iabbrev <buffer> tup \textup{}<Left>
autocmd Filetype tex iabbrev <buffer> ecl \begin{lstlisting}[language=, caption=]<CR><CR>\end{lstlisting}<ESC>2kf=a
autocmd Filetype tex iabbrev <buffer> ecf \lstinputlisting[language=]{}
augroup END
imap jk <Plug>(eskk:toggle)
cmap jk <Plug>(eskk:toggle)
'';
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
start = [ vim-eskk ];
opt = [];
};
}

View File

@@ -0,0 +1,33 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{info-processing}[2025/04/10 Commands and Environments for Information Processing Class Report]
\usepackage{luacode}
\usepackage[dvipsnames]{xcolor}
\usepackage{fancybox}
\usepackage{ascmac}
\usepackage{fancyvrb}
\makeatletter
\newif\ifFV@bgcolor
\newbox\FV@bgbox
\define@key{FV}{bgcolor}{\FV@bgcolortrue\def\FV@bgcolor{#1}}
\define@key{FV}{framecolor}{\FV@bgcolortrue\def\FV@framecolor{#1}}
\def\FV@framecolor{white}
\def\FV@BeginVBox{%
\leavevmode\ifFV@bgcolor\setbox\FV@bgbox=\fi
\hbox\ifx\FV@boxwidth\relax\else to\FV@boxwidth\fi\bgroup
\ifcase\FV@baseline\vbox\or\vtop\or$\vcenter\fi\bgroup}
\def\FV@EndVBox{\egroup\ifmmode$\fi\hfil\egroup
\ifFV@bgcolor\fcolorbox{\FV@framecolor}{\FV@bgcolor}{\box\FV@bgbox}\fi}
\makeatother
\newenvironment{syntax}[1][]
{\VerbatimEnvironment
\begin{itembox}[l]{\sffamily Syntax: #1}\begin{BVerbatim}[bgcolor=Black,frame=lines,commandchars=\$\{\}]}
{\end{BVerbatim}\end{itembox}}
\newcommand{\resultIO}[2]{
}

7
packages/mybibs.sty Normal file
View File

@@ -0,0 +1,7 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mybibs}[2025/04/05 My BibLaTeX Config]
\usepackage[backend=biber,bibencoding=utf8,giveninits=false,style=numeric-comp,date=short,dateabbrev=false]{biblatex}
\addbibresource{../references.bib}
\usepackage[unicode,colorlinks=true,allcolors=blue]{hyperref}
\urlstyle{same}

View File

@@ -0,0 +1,48 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mycodelistings}[2025/04/05 My Code Listings Config]
\usepackage{listings}
\usepackage{xcolor}
\definecolor{draculabg}{RGB}{40,42,54}
\definecolor{draculafg}{RGB}{248,248,242}
\definecolor{draculacomment}{RGB}{98,114,164}
\definecolor{draculacurrentline}{RGB}{68, 71, 90}
\definecolor{draculaorange}{RGB}{255,184,108}
\definecolor{draculacyan}{RGB}{139,244,253}
\definecolor{draculagreen}{RGB}{80,250,123}
\lstdefinestyle{codestyle}{
backgroundcolor=\color{draculabg},
commentstyle=\color{draculacomment},
keywordstyle={\color{draculaorange}},
identifierstyle=\color{draculacyan},
numberstyle=\small\color{draculacurrentline},
stringstyle=\bfseries\color{draculagreen},
basicstyle=\ttfamily\normalsize\color{draculafg},
breakatwhitespace=false,
breaklines=true,
captionpos=t,
keepspaces=true,
numbers=left,
numbersep=14pt,
showspaces=false,
showstringspaces=true,
showtabs=false,
tabsize=4,
lineskip=-3pt,
xrightmargin=32pt,
xleftmargin=32pt,
frame=single,
framerule=1pt,
rulesepcolor=\color{draculacyan},
framexleftmargin=4pt,
framexrightmargin=4pt,
framextopmargin=4pt,
framexbottommargin=4pt,
xleftmargin=5px,
xrightmargin=5px
}
\newcommand{\defaultlistingstyle}{\lstset{style=codestyle}}
\renewcommand{\lstlistingname}{コードリスティング}

48
packages/mycommands.sty Normal file
View File

@@ -0,0 +1,48 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mycommands}[2025/04/09 My Commands Config]
\usepackage{luacode}
\newcommand{\reporttitle}[1]{
\def\@title{#1}
\title{#1}
}
\newcommand{\reportauthor}[1]{
\def\@author{#1}
\author{#1}
}
\newcommand{\reportdate}[3]{
\def\@year{#1}
\def\@month{#2}
\def\@day{#3}
\date{\@year \@month \@day}
}
\newcommand{\turnindate}[3]{
\def\@turninyear{#1}
\def\@turninmonth{#2}
\def\@turninday{#3}
\date{\@turninyear \@turninmonth \@turninday}
}
\newcommand{\schoolname}[1]{\def\@schoolname{#1}}
\newcommand{\studentid}[1]{\def\@studentid{#1}}
\newcommand{\seatingnum}[1]{\def\@seatingnum{#1}}
\newcommand{\department}[1]{\def\@department{#1}}
\newcommand{\subject}[1]{\def\@subject{#1}}
\newcommand{\professor}[1]{\def\@professor{#1}}
\newcommand{\getreportauthor}{\@author}
\newcommand{\getreportdate}{\@year \@month \@day}
\newcommand{\getturnindate}{\@turninyear \@turninmonth \@turninday}
\newcommand{\getreporttitle}{\@title}
\newcommand{\getschoolname}{\@schoolname}
\newcommand{\getstudentid}{\@studentid}
\newcommand{\getseatingnum}{\@seatingnum}
\newcommand{\getdepartment}{\@department}
\newcommand{\getsubject}{\@subject}
\newcommand{\getprofessor}{\@professor}
\newcommand{\compiledTime}{\directlua{tex.sprint("Last Compiled(UN*X Time): " .. tostring(os.time()))}}

73
packages/myfonts.sty Normal file
View File

@@ -0,0 +1,73 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{myfonts}[2025/04/05 My Fonts Configs]
\newif\if@japanese
\DeclareOption{japanese}{\@japanesetrue}
\DeclareOption{no-japanese}{\@japanesefalse}
\ExecuteOptions{japanese}
\ProcessOptions\relax
\if@japanese
\usepackage{luatexja-fontspec}
\usepackage{luatexja}
\else
\usepackage{fontspec}
\fi
\usepackage[lutf8]{luainputenc}
\usepackage[T1]{fontenc}
\if@japanese
\setmainjfont{NotoSerifJP}[
Path=../assets/fonts/,
Extension=.ttf,
YokoFeatures={JFM=jlreq},
TateFeatures={JFM=jlreqv},
UprightFont=*-Regular,
BoldFont=*-Bold,
ItalicFont=*-Regular,
ItalicFeatures={FakeSlant=0.33},
BoldItalicFont=*-Regular,
BoldItalicFeatures={FakeBold=2, FakeSlant=0.33}
]
\setsansjfont{NotoSansJP}[
Path=../assets/fonts/,
Extension=.ttf,
YokoFeatures={JFM=jlreq},
TateFeatures={JFM=jlreqv},
UprightFont=*-Regular,
BoldFont=*-Bold,
ItalicFont=*-Regular,
ItalicFeatures={FakeSlant=0.33},
BoldItalicFont=*-Regular,
BoldItalicFeatures={FakeBold=2, FakeSlant=0.33}
]
\fi
\setmainfont{NotoSerif}[
Path=../assets/fonts/,
Extension=.ttf,
UprightFont=*-Regular,
BoldFont=*-Bold,
ItalicFont=*-Italic,
BoldItalicFont=*-BoldItalic
]
\setsansfont{NotoSans}[
Path=../assets/fonts/,
Extension=.ttf,
UprightFont=*-Regular,
BoldFont=*-Bold,
ItalicFont=*-Italic,
BoldItalicFont=*-BoldItalic
]
\newfontfamily{\fonthack}{Hack}[
Path=../assets/fonts/,
Extension=.ttf,
UprightFont=*-Regular,
BoldFont=*-Bold,
ItalicFont=*-Italic,
BoldItalicFont=*-BoldItalic
]
\renewcommand{\ttfamily}{\fonthack}

11
packages/mygraphics.sty Normal file
View File

@@ -0,0 +1,11 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mygraphics}[2025/04/05 My Graphics(x) Configs]
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{here}
\graphicspath{{../assets}}
\usepackage[hang,small,bf]{caption}
\usepackage[subrefformat=parens]{subcaption}
\captionsetup{compatibility=false}

16
packages/mypagesetup.sty Normal file
View File

@@ -0,0 +1,16 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypagesetup}[2025/04/05 My Page Configs]
\usepackage[
a4paper,
total={166mm, 270mm},
left=22mm,
right=22mm,
top=30mm,
headheight=15mm,
headsep=5mm,
marginparwidth=25mm,
footnotesep=5mm,
footskip=15mm,
bottom=25mm
]{geometry}

9
references.bib Normal file
View File

@@ -0,0 +1,9 @@
@online{example,
title = {Example Entry},
author = {Inc., Example},
organization = {Example, Inc.},
url = {https://www.example.com},
year = {1970},
month = {01},
urldate = {1970-01-01}
}

View File

@@ -0,0 +1,381 @@
local tokenMap = {
"identifier",
"newline",
"whitespace",
"symbol",
"type",
"control",
"comment",
"number",
"string",
"char",
"specialValue"
}
local colorMap = {
["identifier"] = "Gray",
["symbol"] = "Gray",
["type"] = "Yellow",
["control"] = "Yellow",
["comment"] = "SkyBlue",
["number"] = "Dandelion",
["string"] = "Magenta",
["char"] = "WildStrawberry",
["specialValue"] = ""
}
function indexOf(l, v)
for j, k in ipairs(l) do
if k == v then
return j
end
end
return nil
end
function frequency(s)
local res = {}
for i = 1, #s do
local curChar = string.sub(s, i, i)
if res[curChar] == nil then
res[curChar] = 1
else
local n = res[curChar]
res[curChar] = n + 1
end
end
return res
end
function getc(s, i)
return string.sub(s, i, i)
end
function wrapInColor(s, colorName)
return "{$color{" .. colorName .. "}" .. s .. "}"
end
Token = {}
function Token:new(t, c)
local res = {
tokType = t,
tokContent = c
}
self.__index = self
return setmetatable(res, self)
end
Lexer = {}
function Lexer:new(src)
local res = {
source = src,
currStrPos = 1,
currTokPos = 1,
tokens = {},
buffer = "",
isStrAtEnd = false
}
self.__index = self
return setmetatable(res, self)
end
function Lexer:addToken(tokType, tokContent)
table.insert(self.tokens, Token:new(indexOf(tokenMap, tokType), tokContent))
end
function Lexer:printTokens()
for i,j in pairs(self.tokens) do
print("Token Type: ", tokenMap[j.tokType], "\nToken Content: ", j.tokContent)
end
end
function isKeywordType(s)
local cTypes = {"int", "long", "short", "char", "bool", "void", "signed", "unsigned", "float", "double", "size_t", "static", "extern"}
local res = false;
for i = 1, #cTypes do
res = s == cTypes[i]
if res == true then
break
end
end
return res
end
function isKeywordControl(s)
local controlKeywords = {"do", "while", "for", "switch", "case", "default", "if", "else", "break", "return"}
local res = false;
for i = 1, #controlKeywords do
res = s == controlKeywords[i]
if res == true then
break
end
end
return res
end
function isSymbol(s)
local symbols = ""
end
function isDecimalOrOctal(s)
if s == "" then
return false
end
local f = frequency(s)
local counter = 0
local charList = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
for i = 1, #charList do
counter = counter + (f[charList[i]] and f[charList[i]] or 0)
end
local charNumDiff = #s - counter
if charNumDiff == 3 then
local subs = string.sub(s, #s-2, #s)
local fsubs = frequency(subs)
local unsignedCount = (fsubs["u"] and fsubs["u"] or 0) + (fsubs["U"] and fsubs["U"] or 0)
local longCount = (fsubs["l"] and fsubs["l"] or 0) + (fsubs["L"] and fsubs["L"] or 0)
if unsignedCount > 1 then
return false
end
if longCount ~= 2 then
return false
else
return true
end
elseif charNumDiff == 2 then
local subs = string.sub(s, #s-1, #s)
local fsubs = frequency(subs)
local unsignedCount = (fsubs["u"] and fsubs["u"] or 0) + (fsubs["U"] and fsubs["U"] or 0)
local longCount = (fsubs["l"] and fsubs["l"] or 0) + (fsubs["L"] and fsubs["L"] or 0)
if unsignedCount == 1 and longCount == 1 then
return true
elseif longCount == 2 then
return true
else
return false
end
elseif charNumDiff == 1 then
local subs = getc(s, #s)
return subs == "u" or subs == "U" or subs == "l" or subs == "L"
else
return counter == #s
end
end
function isHexadecimal(s)
local f = frequency(s)
local counter = 0
local charList = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'}
if f["x"] == nil and f["X"] == nil and string.sub(s,1,1) ~= "0" then
return false
end
for i = 1, #charList do
counter = counter + (f[charList[i]] and f[charList[i]] or 0)
end
local charNumDiff = #s - counter
if charNumDiff == 3 then
local subs = string.sub(s, #s-2, #s)
local fsubs = frequency(subs)
local unsignedCount = (fsubs["u"] and fsubs["u"] or 0) + (fsubs["U"] and fsubs["U"] or 0)
local longCount = (fsubs["l"] and fsubs["l"] or 0) + (fsubs["L"] and fsubs["L"] or 0)
if unsignedCount > 1 then
return false
end
if longCount ~= 2 then
return false
else
return true
end
elseif charNumDiff == 2 then
local subs = string.sub(s, #s-1, #s)
local fsubs = frequency(subs)
local unsignedCount = (fsubs["u"] and fsubs["u"] or 0) + (fsubs["U"] and fsubs["U"] or 0)
local longCount = (fsubs["l"] and fsubs["l"] or 0) + (fsubs["L"] and fsubs["L"] or 0)
if unsignedCount == 1 and longCount == 1 then
return true
elseif longCount == 2 then
return true
else
return false
end
elseif charNumDiff == 1 then
local subs = getc(s, #s)
return subs == "u" or subs == "U" or subs == "l" or subs == "L"
else
return counter == #s
end
end
function isNumber(s)
return isDecimalOrOctal(s) or isHexadecimal(s)
end
function isSymbol(s)
local symList = "!%^&*()-+=/?,<>{}[];:"
for i = 1, #symList do
if s == getc(symList, i) then
return true
end
end
return false
end
function isNewLine(s)
return s == "\n"
end
function isWhitespace(s)
return s == " "
end
function isDoubleQuote(s)
return s == "\""
end
function isSingleQuote(s)
return s == "\'"
end
function doesWordEnd(s)
return (isWhitespace(s) or isSymbol(s) or (s == "") or (s == "\n"))
end
function Lexer:readString()
self.buffer = self.buffer .. "\""
self.currStrPos = self.currStrPos + 1
repeat
local curr = getc(self.source, self.currStrPos)
self.buffer = self.buffer .. curr
if curr == "\"" then
break
end
self.currStrPos = self.currStrPos + 1
until false
self:addToken("string", self.buffer)
self.buffer = ""
end
function Lexer:readChar()
self.buffer = self.buffer .. "\'"
self.currStrPos = self.currStrPos + 1
local character = getc(self.source, self.currStrPos)
self.buffer = self.buffer .. character
self.currStrPos = self.currStrPos + 1
self.buffer = self.buffer .. "\'"
self:addToken("char", self.buffer)
self.buffer = ""
end
function Lexer:readComment()
self.buffer = self.buffer .. "//"
self.currStrPos = self.currStrPos + 2
repeat
local curr = getc(self.source, self.currStrPos)
if isNewLine(curr) or curr == "" then
break
end
self.buffer = self.buffer .. curr
self.currStrPos = self.currStrPos + 1
until false
self:addToken("comment", self.buffer)
if getc(self.source, self.currStrPos) == "\n" then
self:addToken("newline", "\n")
end
self.buffer = ""
end
function Lexer:read()
for i = 1, #self.source do
local curr = getc(self.source,self.currStrPos)
local nextChar = getc(self.source,self.currStrPos+1)
if isWhitespace(curr) then
if self.buffer ~= "" then
self:addToken("identifier", self.buffer)
end
self.buffer = ""
self:addToken("whitespace", " ")
elseif isDoubleQuote(curr) then
if self.buffer ~= "" then
self:addToken("identifier", self.buffer)
end
self.buffer = ""
self:readString()
elseif isSingleQuote(curr) then
if self.buffer ~= "" then
self:addToken("identifier", self.buffer)
end
self.buffer = ""
self:readChar()
elseif curr == "/" and nextChar == "/" then
if self.buffer ~= "" then
self:addToken("identifier", self.buffer)
end
self.buffer = ""
self:readComment()
elseif isSymbol(curr) then
if self.buffer ~= "" then
self:addToken("identifier", self.buffer)
end
self.buffer = ""
self:addToken("symbol", curr)
elseif isNewLine(curr) then
if self.buffer ~= "" then
self:addToken("identifier", self.buffer)
end
self.buffer = ""
self:addToken("newline", curr)
else
self.buffer = self.buffer .. curr
if isNumber(self.buffer) and doesWordEnd(nextChar) then
self:addToken("number", self.buffer)
self.buffer = ""
elseif isKeywordType(self.buffer) then
self:addToken("type", self.buffer)
self.buffer = ""
elseif isKeywordControl(self.buffer) then
self:addToken("control", self.buffer)
self.buffer = ""
end
end
self.currStrPos = self.currStrPos + 1
end
end
function Lexer:highlight()
local res = ""
for i = 1, #self.tokens do
local tokType = tokenMap[self.tokens[i].tokType]
local tokContent = self.tokens[i].tokContent
local hcolor = colorMap[tokType] and colorMap[tokType] or nil
if hcolor ~= nil then
res = res .. wrapInColor(tokContent, hcolor)
else
res = res .. tokContent
end
end
return res
end
function exec(src)
local lex = Lexer:new(src)
local res = ""
lex:read()
res = lex:highlight()
return res
end
return exec

149
script/generate-main.lua Normal file
View File

@@ -0,0 +1,149 @@
local lyaml = require "lyaml"
local config_file = io.open("document.yaml", 'r')
local yml_str = config_file:read('a')
local config = lyaml.load(yml_str)
coverpage = '\\coverpage'
titleheading = '\\titleheading'
tableofcontents = '\\tableofcontents'
compiledtime = '\\compiledTime'
printbib = '\\printbibliography[heading=bibintoc,title={参考文献}]'
newpg = '\\newpage'
romannumbering = '\\pagenumbering{roman}'
arabicnumbering = '\\pagenumbering{arabic}'
function get_doc_class(cfg)
return "\\documentclass{class/" .. cfg.doc_class .. "}"
end
function get_title(cfg)
return "\\reporttitle{" .. cfg.title .. "}"
end
function get_author(cfg)
return "\\reportauthor{" .. cfg.author.name .. "}"
end
function get_stu_id(cfg)
return "\\studentid{" .. cfg.author.student_id .. "}"
end
function get_stu_seating_num(cfg)
return "\\seatingnum{" .. cfg.author.seating_number .. "}"
end
function get_school_name(cfg)
return "\\schoolname{" .. cfg.school_name .. "}"
end
function get_dep(cfg)
return "\\department{" .. cfg.department .. "}"
end
function get_subject(cfg)
return "\\subject{" .. cfg.subject .. "}"
end
function get_professor(cfg)
return "\\professor{" .. cfg.professor .. "}"
end
function get_additional_packages(cfg)
local res = ""
for i = 1, #cfg.packages do
local options = ""
if cfg.packages[i].options ~= "" then
options = "[" .. cfg.packages[i].options .. "]"
end
res = res .. "\\usepackage" .. options .. "{" .. cfg.packages[i].name .. "}\n"
end
return res
end
function format_date(cfg)
return "\\reportdate{" .. cfg.date.year .. "}{" .. cfg.date.month .. "}{" .. cfg.date.day .. "}"
end
function format_turnin_date(cfg)
return "\\turnindate{" .. cfg.turnin.year .. "}{" .. cfg.turnin.month .. "}{" .. cfg.turnin.day .. "}"
end
function preamble(cfg)
local doc_class = get_doc_class(cfg) .. "\n\n"
local title = get_title(cfg) .. "\n"
local name = get_author(cfg) .. "\n"
local stu_id = get_stu_id(cfg) .. "\n"
local seating = get_stu_seating_num(cfg) .. "\n"
local date = format_date(cfg) .. "\n"
local turnin = format_turnin_date(cfg) .. "\n"
local school = get_school_name(cfg) .. "\n"
local dep = get_dep(cfg) .. "\n"
local subject = get_subject(cfg) .. "\n"
local professor = get_professor(cfg) .. "\n"
local additional_packages = ""
local pgnum = ""
if cfg.paper_config.include_cover_page == true and cfg.doc_class ~= "nitonepage" then
pgnum = "\n" .. romannumbering .. "\n"
end
if cfg.paper_config.use_additional_packages == true then
additional_packages = "\n" .. get_additional_packages(cfg)
end
return doc_class .. title .. name .. stu_id .. seating .. date .. turnin .. school .. dep .. subject .. professor .. additional_packages .. pgnum .. "\n"
end
function report_content(cfg)
local res = "\\begin{document}\n"
if cfg.paper_config.include_cover_page == true then
res = res .. " " .. coverpage .. "\n\n"
end
if cfg.paper_config.include_table_of_contents == true then
res = res .. " " .. tableofcontents .. "\n " .. newpg .. "\n"
end
res = res .. " " .. arabicnumbering .. "\n\n"
for i = 1, #cfg.sections do
res = res .. " " .. "\\input{" .. cfg.sections[i].path .. "}\n"
if cfg.sections[i].newpg == true then
res = res .. " " .. newpg .. "\n\n"
else
res = res .. "\n"
end
end
if cfg.paper_config.use_bib == true then
res = res .. " " .. printbib .. "\n\n"
end
if cfg.paper_config.show_compiled_time == true then
res = res .. " " .. compiledtime .. "\n"
end
res = res .. "\\end{document}"
return res
end
function onepage_content(cfg)
local res = "\\begin{document}\n"
res = res .. " " .. titleheading .. "\n\n"
res = res .. " Content Here\n\n"
res = res .. "\\end{document}"
return res
end
function generate(cfg)
local pre = preamble(cfg)
local doc = ""
local file_content = ""
if cfg.doc_class == "nitreport" then
doc = report_content(cfg)
elseif cfg.doc_class == "nitonepage" then
doc = onepage_content(cfg)
else
print("Error: Invalid document class option")
os.exit(1)
end
file_content = pre .. doc
return file_content
end
print(generate(config))
config_file:close()

View File

@@ -0,0 +1,17 @@
#! /usr/bin/env bash
FILE=`cat <<EOF
{
"language": "",
"name": "",
"description": "",
"output": {
"type": "screenshot | text",
"content": ""
},
"note": ""
}
EOF
`
echo "$FILE"

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
function getGCCVersion () {
local res=""
mkfifo gcc_version
gcc -v 2> gcc_version &
res="$(tail -n 1 gcc_version)"
unlink gcc_version
echo $res
}
function getOS () {
cat /etc/os-release | grep --color=none "^PRETTY" | sed -s 's/PRETTY_NAME=//' | sed -s 's/\"//g'
}
function getArch () {
echo $(uname -m | sed -s 's/_/\\_/g')
}
res="\\subsection{実行環境}\n\n"
res+="この課題のプログラムは以下の環境で動作することが確認されている:\n\n"
res+="\\\\begin{itemize}\n"
res+=" \\item OS: $(getOS)\n"
res+=" \\item CPU アーキテクチャ: \\\\texttt{$(getArch)}\n"
res+=" \\item C コンパイラ: \\\\texttt{$(getGCCVersion)}\n"
res+=" \\item C コンパイラオプション: \\\\texttt{}\n"
res+="\\\\end{itemize}"
echo -e "$res"

View File

@@ -0,0 +1,95 @@
#!/usr/bin/env bash
#==============================================================================
# Section Generator for Info Processing Class's Assignment.
#
# $1 = Directory to program information(info.json)
#
# With following directory structure for programs, it will generate the LaTeX
# section that contains assignment description, code listing, and execution
# result:
# |-programs
# |-prog1
# | |-example.h // included
# | |-main.c // included
# | |-Makefile // excluded
# | |-info.json
# ...
#
# For each program directory, it must contain file named "info.json" which
# contains assignment name, description, type of output(screenshot, list of
# values, or text file), and optional note.
#
# JSON scheme:
# {
# "language": "<Name of Language Defined in LaTeX Listings Package>",
# "name": "<Name of Assignment>",
# "description": "<Description of Assignment>",
# "output": {
# "type": "<screenshot | text",
# "content":
# "<path to screenshot or text file relative to project root>"
# },
# "note": "<Nullable string>"
# }
#
# The output LaTeX section is written to stdout
#==============================================================================
progPath=""
function writeSection () {
local programDirectory="$1"
local jsonFile="$programDirectory/info.json"
local language="$(jq --raw-output '.language' $jsonFile)"
local sectionName="$(jq --raw-output '.name' $jsonFile)"
local description="$(jq --raw-output '.description' $jsonFile)"
local outType="$(jq --raw-output '.output.type' $jsonFile)"
local outContent="$(jq --raw-output '.output.content' $jsonFile)"
local note="\n\n$(jq --raw-output '.note' $jsonFile)"
declare -a listings
local i=0
local x=0
local res=""
[[ $note == "\n\nnull" || $note == "\n\n" ]] && note=""
res+="\\section{$sectionName}\n\n$description\n\n\\subsection{コードリスティング}\n\n"
for f in $(find $programDirectory -name '*.py' -or -name '*.c' -or -name '*.h'); do
listings[i]="\\lstinputlisting[language=$language,title={$sectionName}]{../$f}"
i=$(($i+1))
done
while [[ $x -lt $i ]]; do
res+="$(echo -e "${listings[x]}")\n"
x=$(($x+1))
done
res+="\n\\subsection{実行結果}\n"
if [[ $outType == "screenshot" ]]; then
res+="\n\\\\begin{center}\n \\includegraphics[width=\\\\textwidth]{$outContent}\n\\\\end{center}"
elif [[ $outType == "text" ]]; then
res+="\n\\\\verbatiminput{$outContent}";
else
echo "Invalid Output Type: $outType";
exit 1;
fi
if [[ $note != "" ]]; then
res+="\n\\subsection{考察}\n"
res+="$note"
fi
echo -e $res
}
if [[ -n $1 ]]; then
progPath="$1"
writeSection $progPath
else
echo "No Arguments Provided"
exit 1
fi

5
script/word-count.bash Normal file
View File

@@ -0,0 +1,5 @@
#!/usr/bin/env bash
# count all words including source code
pandoc --from latex $1 --to plain | wc -w

70
section/introduction.tex Normal file
View File

@@ -0,0 +1,70 @@
\section{はじめに}
Start Writing!
Use lualatex + biber to compile.
Test Bib\cite{example}
いろはにほへと ちりぬるを
{\gtfamily \sffamily \LaTeX で自由な組版を。}
{\gtfamily \sffamily Write freely with \LaTeX{}.}
{\ttfamily LaTeX shall be free forever!}
\noindent
この行のテキストは四十二字です。ああああああああああああああああああああああああああいいいい
\defaultlistingstyle
\begin{lstlisting}[language=C, caption=Basic Hello World]
#include <stdlib.h>
int square(int n) {
return n*n;
}
int main(int argc, char** argv) {
char* msg = "Hello World";
int x = 3;
int y = square(x);
printf("%s\n", msg);
printf("f(x) = x^2; x: %d, y: %d\n", x, y);
return 0;
}
\end{lstlisting}
\begin{displaymath}
\int_{a}^{b} f(x) \,dx = F(b)-F(a)
\end{displaymath}
\begin{itemize}
\item C
\item Python
\item Javascript
\item Rust
\item Haskell
\end{itemize}
\begin{enumerate}
\item lualatex <filename>.tex
\item biber <filename>
\item lualatex <filename>.tex
\item lualatex <filename>.tex
\end{enumerate}
\newpage
\section{Section}
section
\subsection{Sub Section}
sub section
\paragraph{Paragraph}
paragraph