TeX / LaTeX에서의 골프 팁


28

사람들이 TeX / LaTeX에서 골프를하기 위해 어떤 팁을 가지고 있습니까? 답변 당 하나의 팁을 게시하십시오. 각 팁은 적어도 TeX / LaTeX에 따라 다릅니다.


컨텍스트 : 나는 이 답변을 보았고 TeX / LaTeX에 대한 팁 질문이 없으므로 이것을 작성하고 있습니다. TikZ에서 골프를 타기위한 더 좁은 질문 과 일부 겹치는 부분이 있습니다 (TikZ는 TeX / LaTeX의 특정 매크로 패키지이므로).이 질문에 대한 답변도 적용되지만 다른 방법은 아닙니다.


비 프로그래밍 언어로 골프를 칠 수있는 방법은 무엇입니까?
그레이트 덕

1
@TheGreatDuck 매우 열악한 :-)
ShreevatsaR

@TheGreatDuck 사실, TeX 보통 인쇄상의 언어로만 사용 되더라도 프로그래밍 언어입니다.
gvgramazio

답변:


15

문서화 된 것보다는 내부 LaTeX 매크로를 고려하십시오

예를 들어 \romanLaTeX 카운터에서 작동하는 문서화 된 LaTeX 매크로입니다. 설정하려면 42XLIV당신은 같은 것을 사용해야 할 것

\newcounter{z}
\setcounter{z}{42}
\roman{z}

대신, \roman구현 방법을 찾아서 ( \show\roman소스 파일을 읽는 대신 대화식으로 가져 오는 데 사용 ) 유용한 매크로라는 용어로 구현 된 \@roman것을 직접 확인할 수 있습니다.

\catcode`@11
\@roman{42}

\catcode`@11골퍼 쓰기 \makeatletter방식 (LaTeX에서는 깔끔한 방식) 또는 \catcode`\@=11(일반 TeX에서는 깔끔한 방식)입니다. 처음에는 한 번만 필요하며 이후에는을 포함하는 매크로 이름을 사용할 수 있습니다 @.


13

~매크로 로 사용할 수 있습니다 (다른 활성 문자처럼)

전에:

\def\a{...some definition...} ... use \a...

후:

\def~{...some definition...} ... use ~...

설명 : 텍에서 일반적으로 매크로는 "제어 순서"입니다 : 당신이 정의 할 수 있습니다 \something또는 \a. 그러나 활동적인 캐릭터를 사용하면 더 짧아 질 수 있습니다. 기본적으로 (일반 TeX / LaTeX에서) 존재하는 유일한 활성 문자는 ~(“넥타이”에 사용됩니다. 즉, \penalty \@M \일반 TeX (10000의 공백, 그 뒤에 공백)와 \nobreakspace {}LaTeX에서 정의 됨)에 사용됩니다. 그러나 필요한 목적을 위해 재정의하는 것을 막을 수있는 것은 없습니다.

또한 : catcode를 \active(13) 으로 설정하여 다른 문자와 동일한 작업을 수행 할 수 있습니다 . 예를 들어, Z활성 문자를 만들 려면 "비용"이 12 바이트 \catcode`Z13입니다. 그런 다음 Z같은 매크로 대신 어디서나 간단하게 사용할 수 있습니다 \z. 특별한 의미로 시작 일부 문자의 경우, 직접 백틱 접근 방식은 작동하지 않습니다 그리고 당신은 한 번 더 문자를 필요 \catcode`\Z13\catcode90=13.


9

\def 고정 패턴과 일치

당신이 있다고 가정 해 봅시다 \def\a #1 #2 {...some definition here...}. 그런 다음 \a Act42, Scene26매크로 와 같은 문자열에서 호출 하면 인수는 # 1 <- Act42,, # 2 <- Scene26와 같이 할당 될 수 있으며 관련 부분을 추출하기 위해 추가 작업을 수행해야합니다. 대신, 직접 쓸 수 있습니다

\def\a Act#1, Scene#2 {...some definition here...}

그런 다음 \a Act42, Scene26직접 # 1 <- 42및 # 2 <- 설정 한 것처럼 호출하십시오 26.

(이것은 기본적으로의 정의 \def이지만, LaTeX에서는 일반적으로 {}함수 호출처럼 인수를 전달하는 것을 선호하므로 잊어 버리기 쉽습니다 .)


8

일반 TeX와 LaTeX 중에서 선택

이것에 대해 많은 것을 말할 수 있지만 간단히 말해서 "Hello"를 인쇄하는 일반적인 일반 TeX 문서와 동일한 일반 LaTeX 문서를 비교하십시오.

Hello
\bye

\documentclass{article}
\begin{document}
Hello
\end{document}

LaTeX (wrt code golf)의 "비용"은 명백합니다. 물론 "장점"은 LaTeX에 미리 작성된 많은 매크로 및 패키지 라이브러리가 포함되어 있으며 그 중 일부는 현재 작업에 유용 할 수 있습니다.


LaTeX를 사용 \@Roman하는 데 어려움을 겪었습니다. (대문자를 평범하게 작동하려면 많은 바이트가 필요하지만) 평범한 TeX는 종종 더 짧습니다.
Chris H

8

\input ... 보다 짧다 \usepackage{...}

예를 들어

\input color

대신에

\usepackage{color}

6 바이트가 적습니다.


8
그러나 \usepackage포함하는 패키지 수가 늘어남에 따라 더 효율적 임을 지적하는 것이 유용 합니다. 하나의 \usepackage명령문으로 둘 이상의 패키지를 사용할 수 있지만 \input모든 패키지에 대해 하나만 필요하므로 3 개 이상의 패키지를 사용 \usepackage하는 경우 더 나은 옵션이됩니다.
밀 마법사

7

LaTeX를 사용하는 경우 short를 사용하십시오documentclass ( Chris H의 아이디어 )

일반적인 것으로 시작하는 대신

\documentclass{article}

하나 book또는 더 짧은 문서 클래스를 선택할 수 있습니다

\documentclass{ecv}

또는

\documentclass{tui}

article기본적으로 해당 페이지의 번호 는 질문의 사양 내에서 유지해야하며 , 이는 추가 출력으로 간주 될 수 있습니다. 아마도 어떤 문서 클래스가 허용되어야 하는지를 결정하기위한 메타 질문 일 것입니다.
밀 마법사

@WheatWizard 좋은 지적입니다. 페이지 번호가 추가 출력으로 간주되는지 여부는 개별 질문에 달려 있다고 생각합니다.
ShreevatsaR 2016 년

나는 최소한의 수업이 좋은 생각이라고 생각합니다-한 글자의 이름과 페이지 번호는 없습니다
Chris H

내가 조립 한 g.cls단지 인 article.cls\pagenumbering{gobble}GitHub의가 다운로하지만 내가 지금 그것을 넣을 수 없습니다
크리스 H


7

라는 환경을 만들기 myenvironment명령을 생성 \myenvironment하고 \endmyenvironment. 내부적으로 환경을 시작하고 종료하는 데 사용됩니다. 경우에 따라 바로 가기로 사용할 수 있습니다. 예를 들어

\begin{itemize}
\item abc
\end{itemize}

하나는 할 수있다

\itemize
\item abc
\enditemize

지원되지 않거나, 신뢰할 수 없으며, 모든 경우에 작동하지 않으며, 자신의 위험 등에서 사용하는 등


사이트에 오신 것을 환영합니다!
DJMcMayhem

3
\itemize{...}더 많은 비용을 절약 할 수 있습니다 .
밀 마법사

4

\usepackage{packagea,packageb,packagec} 옵션을 패키지에 전달하지 않는 한 작동합니다.


4

함께 라인을 실행하십시오. LaTeX / TeX에서는 많은 긴 언어와 비교하여 줄 바꿈이 거의 필요하지 않습니다.


3

인수 주위에 중괄호가 필요할 것으로 예상되는 일부 매크로는 실제로 #1-style 인수가있는 다른 매크로에서 사용될 때 실제로는 그렇지 않습니다 .

대부분의 매크로는 인수에 둘 이상의 토큰 (문자 또는 제어 순서)이있는 경우 중괄호 만 필요합니다.

\mymacro1          % equivalent to \mymacro{1}
\mymacro{12}       % equivalent to \mymacro{12}
\mymacro a         % equivalent to \mymacro{a}
\mymacro{ab}       % equivalent to \mymacro{ab}
\mymacro\foo       % equivalent to \mymacro{\foo}
\mymacro{\foo x}   % equivalent to \mymacro{\foo x}

3

긴 이름을 가진 동일한 매크로를 여러 번 사용해야 \let하는 경우 더 짧은 별명을 정의하는 데 사용할 수 있습니다 .

\let\a\mymacrowithalongname
\a{foo}\a{bar}\a{qux}

\def\a{\mymacrowithalongname}정의에 여러 토큰이 필요하지 않은 경우 에 2 바이트가 절약 됩니다.

매크로 이름 대신 백 슬래시를 저장할 활성 문자 를 가질 수 있습니다 .

\let에만 프리미티브에 내장으로도 매크로 이름에서 작동하지만,하지 않습니다. 예를 들어 \ifnum ... \fi코드에서 많은 구성 을 사용하는 경우 정의 \let\i\ifnum하고 대신 사용 \i ... \fi하면 몇 바이트를 절약 할 수 있습니다. 이것은 심지어 \let자체적으로 작동합니다 \let\l\let.


3

지역 사용 {... }현명 그룹을

이 답변 에서 지적했듯이 같은 활성 문자 ~는 매크로 이름으로 사용할 수 있습니다. 불행히도 ~기본적으로 유일한 활성 문자이며 다른 문자의 catcode를 변경하는 \catcode`!13데 많은 비용이 듭니다. 12 바이트가 걸립니다. 새로운 매크로 정의가 코드의 작은 영역에만 필요한 경우 로컬 그룹이 해결책이 될 수 있습니다.

TeX가에 의해 열린 새 로컬 그룹으로 들어가면 {내부 저장 스택에 새 그룹화 수준이 생성됩니다. 즉, 모든 현재 매크로 및 레지스터가 저장됩니다. 에 명시 적으로 표시되지 않은 경우 수정 사항 \global은 이제 그룹이 닫힐 때까지만 활성화됩니다 }. 이것은 ~그룹 내에서 재정의 될 수 있고, 새로운 정의와 함께 사용되며, 그룹이 완료되면 이전 정의가 자동으로 복원됨을 의미합니다.

예를 들면 다음과 같습니다.

\def~{abc}
~ -- {\def~{123}~} -- ~

이 출력

abc-123-abc

이 그룹화 메커니즘의 흥미로운 부작용은 이전 값이 그룹 내에서 변경 될 때까지 계속 사용할 수 있다는 것입니다. 이를 설명하기 위해 카운터 값을 기준으로 여러 문자를 인쇄하고 고정 길이까지 공백으로 채우고 원래 카운터 값으로 계속 진행한다고 가정하십시오. 이것은 다음에 의해 달성 될 수 있습니다.

\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.

어떤 출력

문자를 3 번 ​​인쇄하고 7 칸으로 채우고 x = 3으로 계속하십시오.

이 그룹화 동작은 \loop ... \repeat중첩 중첩에 TeX의 표준 매크로를 사용하려는 경우 특히 중요합니다 . 이 매크로는 내부 명령을 정의하고 진행 방법을 결정하는 데 사용합니다. 내부 루프를 중괄호에 넣지 않고 중첩하면 내부 명령이 혼동되어 예기치 않은 동작이 발생합니다.


1

같은 카운터의 발전

\advance\u by 1
\multiply\u by 3
\divide\u by 2

또한 일

\advance\u1        % \u = \u + 1
\advance\u-1       % \u = \u - 1
\multiply\u3       % \u = \u * 3
\multiply\u\u      % \u = \u * \u
\divide\u2         % \u = \u / 2

초기화에도 동일한 원칙이 적용됩니다.

\newcount\u\u1

카운터 \ u를 1로 설정합니다.

이것 뒤에 공백 문자 (줄 바꿈 또는 공백)가 필요 \relax하지만 (또는 공백은 동일하지만) 다음 명령은 무시되지 않습니다. 예를 들어

\u1\the\u

\ u를 인쇄하지 않지만 \the명령을 무시합니다 .


1

\enddocument\end{document}두 문자 를 저장하는 대신


그래도 작동하지 않는 것 같습니다 \begin{document}=>\document
sheß
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.