KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
One man tells a falsehood, a hundred repeat it as true.
FrontPage › TeX산술연산

목차

1 TeX 산술연산
1.1 덧셈과 뺄셈
1.2 곱셈
1.3 나눗셈
1.4 예제
2 LaTeX 산술연산
2.1 \newcounter, \setcounter
2.2 calc 패키지
2.2.1 연산자
2.2.2 실수표시명령
3 실수연산 흉내내기 : realcalc.tex

TeX은 내부적으로 고정소숫점 연산을 행한다. 사용자 수준에서는 정수(integer)에 대한 산술연산을 할 수 있다.

1 TeX 산술연산

모든 연산은 counter와 dimension에 대해서 행해진다.
  • counter란 \count register에 등록된 바이트를 가리킨다. TeX은 256(255)개의 count register를 사용할 수 있다. PlainTeX에서 정의된 \newcount 명령은 현재 사용되지 않는 count register를 자동할당하여 \countdef 명령을 부르는 매크로이다. counter에 대해서는 정수 연산을 한다.
  • dimension은 고정 길이값이다. dimension에 대해서는 실수 연산을 한다.

1.1 덧셈과 뺄셈

\advance _variable_ by _number_
by는 생략할 수 있다.
\newcount\mycnt\mycnt=1
\newdimen\mydim\mydim=10pt
\advance\mycnt by1\advance\mydim by10.1pt
\the\mycnt\quad\the\mydim
\newcount\mycnt\mycnt=1
\newdimen\mydim\mydim=10pt
\advance\mycnt by1\advance\mydim by10.1pt
\the\mycnt\quad\the\mydim

1.2 곱셈

\multiply _variable_ by _number_
역시 by는 생략할 수 있다.

곱셈의 결과는 절대값 $$2^{30}$$ 을 넘을 수 없다.
\newcount\mycnt\mycnt=1
\newdimen\mydim\mydim=10.24pt
\multiply\mycnt by4\multiply\mydim by2
\the\mycnt\quad\the\mydim
\newcount\mycnt\mycnt=1
\newdimen\mydim\mydim=10.24pt
\multiply\mycnt by4\multiply\mydim by2
\the\mycnt\quad\the\mydim

dimen에 곱하는 수는 counter이다.

1.3 나눗셈

\divide _variable_ by _number_
by는 생략가능.

\newcount\mycnt\mycnt=5
\newdimen\mydim\mydim=10.24pt
\divide\mycnt by3\divide\mydim by3
\the\mycnt\quad\the\mydim
\newcount\mycnt\mycnt=5
\newdimen\mydim\mydim=10.24pt
\divide\mycnt by3\divide\mydim by3
\the\mycnt\quad\the\mydim

counter 나눗셈에서는, 나눈 결과의 나머지는 버린다. 즉, 나눈 결과도 정수로 취급된다.

이 성질을 이용하여, 특정한 정수의 마지막 한 자리, 예컨대 13의 끝자리 3을 구하는 루틴을 구성해보자.
\count@\TmpInt
\ifnum\count@<\z@ \count@-\count@ \fi\count2\count@
\divide\count2 10 \multiply\count2 10 \advance\count@-\count2
여기서는 \TmpInt를 받아들여서 \count2에 저장하였다. 그런 다음, 10으로 나누고 다시 10을 곱하여 얻어진 수(10)로 원래의 숫자를 빼준 것이다. 그러면 마지막 1의 자리 3이 남는다. 이 루틴은 HLaTeX에서 자동조사를 처리하기 위해 채택한 것이기도 하다.

1.4 예제

위의 산술연산을 이용해서 두 수의 최대공약수를 구하는 매크로입니다. 최대공약수 구하는 알고리즘은 그 유명한 유클리드 알고리즘을 이용했습니다.
\newcount\m \newcount\n \newcount\t

\def\euclid#1#2{\m=#1 \n=#2
  \ifnum\n>\m \t=\m \m=\n \n=\t \fi
  \ifnum\n=0 \number\m
  \else\t=\m \divide\m\n \multiply\m\n \advance\t-\m \euclid\n\t \fi}

다음과 같이 이용합니다.

\newcount\m \newcount\n \newcount\t

\def\euclid#1#2{\m=#1 \n=#2
  \ifnum\n>\m \t=\m \m=\n \n=\t \fi
  \ifnum\n=0 \number\m
  \else\t=\m \divide\m\n \multiply\m\n \advance\t-\m \euclid\n\t \fi}
    
The greatest common divisor of $119$~and~$544$ is $\euclid{119}{544}.$

The greatest common divisor of $2166$~and~$6099$ is $\euclid{2166}{6099}.$
위 예는 아래로 부터 얻은 것입닌다.

The greatest common divisor of $119$~and~$544$ is $\euclid{119}{544}.$
The greatest common divisor of $2166$~and~$6099$ is $\euclid{2166}{6099}.$

2 LaTeX 산술연산

2.1 \newcounter, \setcounter

\newcounter는 새로운 카운터 변수를 정의한다. PlainTeX\newcount와 거의 동일하지만 LaTeX 특유의 형식으로 쓰인다. 즉, 일반적으로 \csname에 해당하는 \ 문자 없이 카운터 변수만 지정함으로써, 이후에 여러 가지 사용법을 보다 편리하게 구현하려 하였다.
\documentclass{article}
\usepackage{hfont}
\usepackage{ifthen}

\begin{document}
%% newcounter
\newcounter{ddd}        % LaTeX 선언형식. 카운터 변수 ddd를 정의함
\newcount\dddd  % PlainTeX 형식. 카운터 변수 \dddd를 정의함

%% setcounter
\setcounter{ddd}{0}     % LaTeX 형식
\dddd=0                 % PlainTeX 형식

%% 카운터 하나 증가시키기
\stepcounter{ddd} %     현재의 카운터에 1을 더한다.(LaTeX)
\advance\dddd by 1%     현재의 카운터에 1을 더한다.(PlainTeX)

\addtocounter{ddd}{3}%  현재의 카운터에 3을 더한다.(LaTeX)
\advance\dddd by 3%     현재의 카운터에 3을 더한다.(PlainTeX)

%% 표현형식(LaTeX)
\arabic{ddd}
\Alph{ddd}
\alph{ddd}
\Roman{ddd}
\roman{ddd}

%% 숫자 참조
\theddd         % LaTeX에서 현재 저장된 ddd의 카운터를 부르는 방법
\number\dddd    % PlainTeX에서 현재 저장된 dddd의 카운터를 부르는 방법. \the\dddd도 같음.

%% 다음 문장은 언제나 Right만 실행된다.
\ifthenelse{\equal{\value{ddd}}{\theddd}}
        {Right}{Wrong}

%% \dddd를 하나 증가시키자.(ddd=4, \the\dddd=5)
\advance\dddd by 1

%% 당연히 두 값은 다를 것이다.
\ifthenelse{\equal{\value{ddd}}{\the\dddd}}
        {Right}{Wrong. \theddd\ is not equal to \the\dddd}

\end{document}

2.2 calc 패키지

TeX의 산술연산 명령들인 \advance, \multiply 등은 말단사용자(end-user)가 쓰기에는 너무 불편하다. LaTeX에서는 calc 패키지를 통하여 산술연산을 수행하도록 하고 있다. 이 산술연산은 Counter(Number)와 Dimension 등에 적용된다.
<!> Dimension이란 길이단위가 붙는 길이변수를 가리킨다.
  • \newcounter, \setcounter에 의하여 설정되는 counter(정수)
  • \newlength, \setlength에 의하여 설정되는 dimension(실수)
  • \widthof, \heightof, \depthof에 의하여 구해지는 text box의 크기(실수)
  • 2.2.1 연산자

    1. $$+$$
    2. $$-$$
    3. $$*$$
    4. $$/$$

    2.2.2 실수표시명령

    1. \real
    2. \ratio
      <!> counter와 같은 정수 연산에서 결과의 소수 부분은 버린다. 예를 들면 \setcounter{x}{3*\real{1.6}}의 결과는 카운터 x에 4를 할당할 것이다.

    3 실수연산 흉내내기 : realcalc.tex


    LaTeX은 dimension에 대하여 실수연산이 calc 패키지를 통하여 가능하지만, TeX/LaTeX에서 일반적인 실수 연산은 사실상 매우 어렵다.

    여기에 소개하는 realcalc.tex은 Frank Bochholz씨가 만든 PlainTeX 베이스의 패키지로서, 실수 연산이 가능한 것처럼 만들어두었다. 다룰 수 있는 수의 범위는 -2147483647.999999999에서 2147483647.999999999까지이고, 나눗셈이 구현되어 있지 않지만, 실수연산이 꼭 필요할 때 쓸 수 있을 것이다.(나눗셈은 소수곱셈으로 바꾸어서 사용해야 할 것이다.) 다음은 LaTeX에서의 사용례이다.

    \documentclass{article}
    \input realcalc
    
    \def\a{2.550}
    \def\b{3.660}
    \parindent=0pt
    
    \begin{document}
    
    \verb|\a|=\a \quad \verb|\b|=\b
    
    \begin{tabular}{cc}
    add &
    \Radd\c\a\b
    \Rtrunc\c2\c
    \Rtrunc\a2\a
    \Rtrunc\b2\b
    \c \verb|=| \a \verb|+| \b
    \\
    
    subst &
    \Rsub\d\a\b
    \Rtrunc\d2\d
    \d
    \\
    
    multiply &
    \Rmul\e\a\b
    \Rtrunc\e2\e
    \e
    \end{tabular}
    
    \end{document}
    


    Contributors : Karnes


    ^
    Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2007-02-07 22:56:21
    Processing time 0.0478 sec