LaTeX/Макрои
Документи производе са командама које сте научили до сад и они изгледају прихватљиво за велики део аудиторијума. Иако не изгледају фенси, они поштују сва утврђена правила и текстуални распоред, који их чини лаким за читање и пријатним за око. Међутим, постоје ситуације у којима LaTeX не даје команду или окружење које одговара вашим потребама, или излазна вредност неке већ постојеће команде не може задовољити ваше захтеве.
У овом поглављу ћемо покушати да дамо неке савете о томе како да научите нове LaTeX трикове и како да направите да штампање изгледа другачије од онога што је обезбеђено по подразумеваној опцији.
LaTeX је језик на релативно високом нивоу у односу на Plain TeX и стога је ограниченији. Следеће поглавље ће се фокусирати на Plain TeX и обајсниће напредне технике за програмирање.
Нове команде
уредиДа бисте додали своје команде, користите
\newcommand{име}[num]{дефиниција}
|
команду. У суштини, команда захтева два аргумента: име команде коју желите да креирате и дефиниција команде. Запамтите да команда име може, али не мора бити затворена у заградама, како ви желите. Аргумент num у загради је опциони и прецизира број аргумената које нова команда узима (могуће је до 9 команди). Ако нема подразумевану 0, онда ниједан аргумент није дозвољен.
Следећа два примера требало би да вам помогну да добијете идеју. Први пример дефинише нову команду под називом \wbal која ће штампати “Викикњига о LaTeX-у”. Таква наредба може добро доћи ако бисте морали да напишете наслов ове књиге изнова и изнова.
\newcommand{\wbal}{Викикњига о \LaTeX}
Ово је ‘‘\wbal'' \ldots{} ‘‘\wbal''
|
Ово је “Викикњига о LaTeX” … “Викикњига о LaTeX” |
Следећи пример илуструје како треба дефинисати нову команду која узима један аргумент. Таг #1
бива замењен аргументом који сте одредили. Ако желите да користите више од једног аргумента, користите #2
и тако даље, ови аргументи се додају у додатни сет заграда.
\newcommand{\wbalsup}[1] {
Ово је Викикњига о LaTeX
подржана од стране #1}
\newcommand{\wbalTwo}[2] {
Ово је Викикњига о LaTeX
подржана од стране #1 и #2}
% у телу документа:
\begin{itemize}
\item \wbalsup{Wikimedia}
\item \wbalsup{многих корисника!}
\item \wbalTwo{John Doe}{Anthea Smith}
\end{itemize}
|
|
Именујте своју нову команду \wbalTwo
а не \wbal2
са бројевима јер се не може користити за именовање макроа — неважећи знакови ће избацити грешку при компајловању.
LaTeX неће дозволити да креирате нову команду која ће прегазити постојећу. Али постоји посебна команда у случају да експлицитно желите ово: \renewcommand
. Користи исту синтаксу као \newcommand
команда.
У одређеним случајевима можда ћете желети да користите \providecommand
команду. Радио исто као \newcommand
, али ако је команда већ дефинисана, LaTeX ће тихо игнорисати нову команду.
Са LaTex2e, такође је могуће додати подразумевани параметар у команду са следећом синтаксом:
\newcommand{name}[num][default]{дефиниција}
|
Ако је подразумевани параметар \newcommand
присутан, онда је први број аргумената онај који је навео num је уствари опционалан са подразумеваном вредношћу default; ако нема, онда су сви аргументи обавезни.
\newcommand{\wbalTwo}[2][Wikimedia]{
Ово је Викикњига о LaTeX
подржана од стране {#1} и {#2}!}
% in the document body:
\begin{itemize}
\item \wbalTwo{John Doe}
\item \wbalTwo[многих корисника]{John Doe}
\end{itemize}
|
|
- Напомена
- Када се команда користи са експлицитним првим параметром, он је дат у загради (овде "[многих корисника]").
Ево једног честог примера: ако пишете књигу о Математици и морате да користите векторе, морате да одлучите како ће изгледати. Постоји неколико различитих стандарда, који се користе у многим књигама. Ако је a вектор, неки људи воле да додају стрелицу изнад њега ( ), други људи подвлаче (a); још једна честа верзија је болдовање (a). Претпоставимо да желите да пишете векторе са стрелицом изнад њих; онда додајте следећу линију у ваш mystyle.sty.
\newcommand{\myvec}[1]{\vec{#1}}
|
и пишете ваше векторе у новој \myvec{...}
команди. Можете га звати како год желите, али је боље да изаберете кратко име јер ћете га вероватно писати веома често. Затим, ако се предомислите и желите да ваши вектори другачије изгледају само треба да промените дефиницију ваше \myvec{...}
команде. Користите овај приступ кад год можете: то ће вам уштедети много времена и повећати доследност вашег документа.
Декларисање јаких команди
уредиНеке команде су ломљиве, тако да не успевају у неким срединама. Ако макро ради у телу текста, али не и у (на пример) фигури натписа, вреди покушавати замену \newcommand{\MyCommand}...
декларацију са \DeclareRobustCommand{\MyCommand}...
у преамбули. Ово посебно важи за макро који, када је проширен, производи текст који је уписан у .aux фајл.
Нова окружења
уредиБаш као и са \newcommand
командом, постоји команда за стварање својег окружења. Команда \newenvironment
користи следећу синтаксу:
\newenvironment{име}[num]{before}{after}
|
Поново \newenvironment
може имати опциони аргумент. Када је \begin{name}
команда (са којом почиње окружење) пронађена, материјал који је наведен у before аргументу се води пре текста у окружење на обрађивање. Материјал у after аргументу бива обрађен када се наиђе на \end{name}
команду (са којим се завршава окружење).
Аргумент num се користи на исти начин као и у \newcommand
команди. LaTeX проверава да не дефинише окружење које већ постоји. Ако икада пожелите да промените постојеће команде, можете користити \renewenvironment
команду. Користи исту синтаксу као и \newenvironment
команда.
Пример испод илуструје употребу \newenvironment
команде:
\newenvironment{king}
{ \rule{1ex}{1ex}\hspace{\stretch{1}} }
{ \hspace{\stretch{1}}\rule{1ex}{1ex} }
\begin{king}
Моје скромне теме \ldots
\end{king}
|
Додатан простор
уредиКада креирате ново окружење можете лако бити успорени од стране додатног простора, који потенцијално могу имати фаталне последице. На пример, када ви
желите да створите окружење за наслове које их потискује својим увлачењем као и
наредни параграф. Команда \ignorespaces
у
begin блоку окружења ће игнорисати сваки простор након извршавања
овог дела команде. Блок end је мало компликованији јер се јавља као посебна обрада
на крају окружења. With the \ignorespacesafterend
LaTeX ће издати команду \ignorespaces
након што је посебна ‘end’ обрада завршена.
\newenvironment{simple}%
{\noindent}%
{\par\noindent}
\begin{simple}
Погледајте простор\\на лево.
\end{simple}
Исто је и\\овде.
|
Погледајте простор на лево. Исто је и овде. |
\newenvironment{correct}%
{\noindent\ignorespaces}%
{\par\noindent%
\ignorespacesafterend}
\begin{correct}
Нема места\\на лево.
\end{correct}
Исто је и\\овде.
|
Нема места на лево. Исто је и овде. |
Такође, ако и даље имате проблема са додатним простором који се појавља на крају вашег окружења када се користи \input за спољни извор, уверите се да нема размака између почетка, извора и краја окружења, као што је:
\begin{correct}\input{некифајл.tex}\end{correct}
|
или
\begin{correct}%
\input{некифајл.tex}%
\end{correct}
|
Декларисање команди са новим окружењем
уредиНове команде могу бити декларисане у новим окружењима. Команде које су декларисане са новим окружењем се односе на њихове аргументе са удвајањем # знака. У следећем примеру, ново окружење је декларисано уз гранање команде:
\newenvironment{topics}{
\newcommand{\topic}[2]{ \item{##1 / ##2\} }
Теме:
\begin{itemize}
}
{
\end{itemize}
}
|
Ако грешком, аргументи прођу до \topics , макро је дефинисан са једним # знаком, и изаћиће следећа порука о грешци:
! Illegal parameter number in definition of \topics.
Проширење броја аргумената
уредиПакет xkeyval ће вам омогућити да дефинишете кључ/вредност опција за команде.
\mycommand[key1=value1, key3=value3]{неки текст}
|
Пакет је прилично комплетан и документација је потпуна. Препоручујемо програмерима да о пакету прочитају. [1]
Хајде да погледамо један једноставан пример [1]:
\usepackage{xkeyval}
% ...
\makeatletter
\def\my@emphstyle#1{\csname my@style@#1\endcsname}
%% Предефинисани стилови
\providecommand\my@style@default{\em}
\providecommand\my@style@bold{\bfseries}
\define@key{myemph}{code}{%
\def\my@emphstyle{#1}
}
\define@key{myemph}{style}{%
\def\my@emphstyle{\csname my@style@#1\endcsname}
}
\newcommand\setemph[1]{%
\setkeys{myemph}{#1}
}
\renewcommand\emph[1]{%
{\my@emphstyle #1}
}
\makeatother
Нешто \emph{битно}
\setemph{style=bold}
Нешто \emph{битно}
\setemph{code=\Large\sffamily}
Нешто \emph{битно}
|
Аритметика
уредиLaTeX може манипулисати бројевима.
Пакет calc обезбеђује заједничку infix нотацију.
\usepackage{calc}
% ...
\newcounter{mine}
\setcounter{mine}{2*17}
\themine
|
За високе прецизности код израчунавања, можете користити fp[2] пакет.
\usepackage{fp}
% Clip
\[
\FPmul\result{2}{7}
\FPclip\result\result
2*7 = \result
\]
% Infix
\[
\newcommand\result{11}
\sqrt{\sin(2+\result)} \approx
\FPeval\result{round(root(2,sin(result + 2.5)),2)}
\result
\]
% Postfix
\[
\FPupn\result{17 2.5 + 17.5 swap - 2 1 + * 2 swap /} % or \FPupn\result{2 17.5 17 2.5 + - 2 1 + * /}
\FPclip\result\result
(17+2.5 - 17.5) * (2+1) / 2 = \result
\]
% Велика прецизност
\[
\FPdiv\result{17}{7}
\frac{17}{7} \approx \FPtrunc\result\result{3}
\result
\]
|
Кондиционали
уредиLaTeX може користити кондиционале захваљујући ifthen пакету.
\usepackage{ifthen}
% ...
\ifthenelse{ \equal{\myvar}{true} }{
Ово је true.
}{
Ово је false.
}
|
Петље
уредиЕкстензија PGF/TikZ пружа \foreach
команду.
\usepackage{tikz}
% ...
\foreach \i/\q in {пшеница/50g, вода/1L, квасац/2g}{
\noindent\i\dotfill\q\\
}
|
Ако користите само \foreach
а не цртање графика, можете користити директно pgffor
пакет.
Алтернативно, можете проверити multido пакет.
Стрингови
уредиxstring пружа пуно могућности. Из CTAN:
- тестирање садржаја стринга
- распакивање подстрингова
- замена подстрингова
- дужина стринга
- позиција подстринга
- број појављивања подстринга
Примери:
\usepackage{xstring}
% ...
\newcommand\mystr{Здраво свете!}
Стринг ``\mystr'' има \StrLen{\mystr}{} знакове.
Предикат ``\mystr{} садржи реч Здраво'' је \IfSubStr{\mystr}{Здраво}{true}{false}.
|
LaTeX "куке"
уредиLaTeX пружа две врсте куке:
\AtBeginDocument
ће вам одредити скуп команди које ће бити извршене када се наиђе на\begin{document}
.\AtEndDocument
ради исто само на\end{document}
.
То вам даје мало више флексибилности за макрое. То може бити корисно за замену поставки које се извршавају после преамбуле. Ове куке се могу искористити неколико пута. Команде ће бити извршене у циљу због кога су и постављене.
На пример, хајде да заменимо бројеве страница са oldstylenums:
\usepackage{textcomp}
\AtBeginDocument{%
% Прави бројеве страница у тексту фигура
\let\myThePage\thepage
\renewcommand{\thepage}{ \oldstylenums{\myThePage} }
}
|
Ту су и куке за класе и пакете. Погледајте Креирање пакета.
Командна линија LaTeX-а
уредиАко радите на Unix-like OS, можете да користите Makefiles или било какву другу скрипту како би направили ваше LaTeX пројекте. С тим у вези могло би бити интересантно прављење различитих верзија истог документа позивом LaTeX-а са параметрима командне линије. Ако додате следећу структуру у ваш документ:
\usepackage{ifthen}
%...
% подразумевана вредност.
\providecommand\blackandwhite{false}
%...
\ifthenelse{ \equal{\blackandwhite}{true} }{
% "црно и бело" мод; ради нешто..
}{
% "боја" мод; ради нешто другачије..
}
|
Сада можете позвати LaTeX овако:
latex '\providecommand{\blackandwhite}{true}\input{test.tex}'
Прво се команда \blackandwhite
дефинише, а затим се стварни фајл учита са уносом. Онда, постављањем \blackandwhite
на false верзија боје документа би се направила.
Референцирање
уреди