-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWeek5.tex
150 lines (100 loc) · 4.95 KB
/
Week5.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
\documentclass[autodetect-engine,dvipdfmx]{jsarticle}
\usepackage{newpxtext,amsmath,array}
\usepackage[deluxe]{otf}
\usepackage[breakable]{tcolorbox}
\title{「新たな税込価格」の計算}
\author{東大TeX愛好会}
\date{Week5}
\begin{document}
\maketitle
\begin{abstract}
Week3では,カウンタの取り扱いが話題として取り上げられましたが,そこでは「あらかじめ用意されたカウンタを用いて四則計算できるのは,整数どうしに限られる」という制限がありました。
そこで今回は,消費税増税によって値段がどれくらい値上がりしたかを計算するマクロを作製し,小数点以下を四捨五入するという操作を\TeX 上で実現しました。
\end{abstract}
\part{マクロ解説}
それでは,今回のマクロにおいて使用した技(と言えるものもないですが)をご紹介いたします。
\section{四捨五入する機能の装填}
このマクロでは「小数点以下を四捨五入する」操作は以下のような順序で実現しています。
\renewcommand{\labelenumi}{\ajMaru{\theenumi}}
\begin{enumerate}
\item 小数点以下を切り捨てた整数値をとりあえず出力する
\item 10倍してから小数点以下を切り捨てた値を計算し,その値を暫定カウンタ\verb|\@tempcnta|に入力する
\item \ajMaru{1}で計算した整数値を10倍したものを求めて暫定カウンタ\verb|\@tempcntb|に入力し,その値をカウンタ\verb|\@tempcnta|の値から引く
\item \ajMaru{3}で出て来た1桁の数値が5以上か否かを判定し,もし5以上だったら小数点以下の切り上げが必要なので,\ajMaru{1}の値に1を足す操作を行う
\end{enumerate}
四捨五入する機能のみを抜粋した部分について,マクロのどの部分が上の4つの操作のどれに対応しているのかを説明すると,以下のようになります。
\begin{tcolorbox}[breakable]
\begin{verbatim}
(\newcount\zeikomi)
{\zeikomi= #1\relax
\multiply \zeikomi by 108\relax
\divide \zeikomi by 105\relax
\@tempcnta=#1\relax
\multiply \tempcnta by 1080\relax
\divide \@tempcnta by 105\relax
\@tempcntb=\zeikomi\relax
\multiply \@tempcntb by 10\relax
\advance \@tempcnta by -\@tempcntb \relax
\ifnum \@tempcnta>4 \relax
\advance \zeikomi by 1 \\relax
\fi
\the\zeikomi}
\end{verbatim}
\end{tcolorbox}
今回のマクロは,四捨五入ののち整数値を出力する命令でしたが,これを応用することで「小数第2位を四捨五入して,小数第1位までの値を出力する」マクロも作製することができるでしょう。
\section{カウンタ値を出力}
\TeX においては
\begin{tcolorbox}
\begin{verbatim}
\newcount\hoge
\end{verbatim}
\end{tcolorbox}
というように\verb@\hoge@というカウンタを定義した際,
\begin{tcolorbox}
\begin{verbatim}
\the\hoge
\end{verbatim}
\end{tcolorbox}
という命令によってカウンタ値を出力することができます。
\section{条件分岐}
このマクロは,小数点以下を「切り捨てる」場合と「四捨五入する場合」の2つが文脈によって使い分けられることを想定しています。このような場合は,制御綴の文字列が似ている方が使用する際に便利ですよね。そこで,アスタリスクが文末にあるかないかで条件分岐を行う事ができ,
\begin{tcolorbox}
\begin{verbatim}
\def\hoge{\@ifstar\@hoge\@@hoge}
\def\@hoge#1#2...{アスタリスクがある場合の命令}
\def\@@hoge#1#2{アスタリスクがない場合の命令}
\end{verbatim}
\end{tcolorbox}
とコマンドを書くことで条件分岐が可能になります。
消費税引き上げによりこのマクロが過去の産物となってしまわないことを願って,筆を置かせていただきます。最後までご覧いただきありがとうございました。
\begin{tcolorbox}[breakable]
\begin{verbatim}
\documentclass[uplatex]{jsarticle}
\makeatletter
\newcount\zeikomi
\def\newzeikomi{\@ifstar\@newzeikomi\@@newzeikomi}%
\def\@newzeikomi#1{\zeikomi= #1\relax
\multiply \zeikomi by 108\relax
\divide \zeikomi by 105\relax
\@tempcnta=#1\relax
\multiply \@tempcnta by 1080\relax
\divide \@tempcnta by 105\relax
\@tempcntb=\zeikomi\relax
\multiply \@tempcntb by 10 \relax
\advance \@tempcnta by -\@tempcntb\relax
\ifnum \@tempcnta>4\relax
\advance \zeikomi by 1\relax
\fi
\the\zeikomi}%
\def\@@newzeikomi#1{\zeikomi= #1\relax
\multiply \zeikomi by 108\relax
\divide \zeikomi by 105\relax
\the\zeikomi}%
\makeatother
\begin{document}
2014年4月1日の消費税増税に伴い,それまで税込価格210円だった商品は税込価格\newzeikomi{210}円となってしまった.
また,それまで160円で乗車できた電車にICカードを用いて乗車する際の運賃は,\newzeikomi*{160}円となった.
\end{document}
\end{verbatim}
\end{tcolorbox}
\end{document}