LaTeX/Макрои

Извор: Викикњиге

LaTeX

Почетак
  1. Увод100% завршен  Dec 13, 2015
  2. Инсталација100% завршен  Dec 13, 2015
  3. Инсталација додатних пакета 100% завршен  Dec 13, 2015
  4. Основе 100% завршен  Dec 13, 2015
  5. Како пронаћи помоћ 100% завршен  Dec 13, 2015

Заједнички елементи

  1. Структура документа 100% завршен  Dec 28, 2015
  2. Форматирање текста 100% завршен  Dec 27, 2015
  3. Форматирање параграфа 100% завршен  Јан 02, 2016
  4. Боје 100% завршен  Jan 10, 2016
  5. Слова100% завршен  Jan 10, 2016
  6. Структура листи 100% завршен  Jan 10, 2016
  7. Посебни знакови 100% завршен  Jan 10, 2016
  8. Интернационализација 100% завршен  Jan 10, 2016
  9. Ротација 100% завршен  Jan 10, 2016
  10. Табеле 100% завршен  Jan 10, 2016
  11. Стварање наслова 100% завршен  Jan 10, 2016
  12. Распоред стране 100% завршен  Jan 10, 2016
  13. Увоз графике 100% завршен  Jan 10, 2016
  14. Фигуре и натписи100% завршен  Jan 10, 2016
  15. Фусноте и Маргине100% завршен  Jan 10, 2016
  16. Хиперлинкови 100% завршен  Jan 10, 2016
  17. Ознаке и референцирање100% завршен  Jan 10, 2016

Механика

  1. Грешке и упозорења 75% завршен  Јан 02, 2016
  2. Дужине 100% завршен  Јан 02, 2016
  3. Бројачи 100% завршен  Јан 02, 2016
  4. Кутије 100% завршен  Јан 02, 2016
  5. Правила и носачи 100% завршен  Јан 02, 2016

Технички текстови

  1. Математика100% завршен  Jan 10, 2016
  2. Напреднија математика 75% завршен  Jan 10, 2016
  3. Теореме
  4. Хемијска графика 75% завршен  Јан 02, 2016
  5. Алгоритми 75% завршен  Јан 02, 2016
  6. Листирање изворног кода 100% завршен  Јан 02, 2016
  7. Лингвистика 75% завршен  Јан 02, 2016

Посебне стране

  1. Индексирање 75% завршен  Јан 02, 2016
  2. Речник 75% завршен  Јан 02, 2016
  3. Управљање библиографијом‎ 75% завршен  Jan 10, 2016
  4. Више библиографије

Посебни документи

  1. Писма 50% завршен  Јан 02, 2016
  2. Презентације 75% завршен  Јан 02, 2016
  3. Учитељски део 75% завршен  Jan 10, 2016
  4. Кратка биографија 50% завршен  Јан 02, 2016

Креирање графика

  1. Представљање процедуралних графика 100% завршен  Јан 02, 2016
  2. МетаПостови 0% завршен  Јан 02, 2016
  3. Слика 50% завршен  Јан 02, 2016
  4. PGF/TikZ 25% завршен  Јан 02, 2016
  5. PSTricks 50% завршен  Јан 02, 2016
  6. Xy-pic 25% завршен  Јан 02, 2016
  7. Прављење 3D графикa 75% завршен  Јан 02, 2016

Програмирање

  1. Макрои 100% завршен  Jan 10, 2016
  2. Обичан ТеХ‎ 100% завршен  Jan 10, 2016
  3. Креирање пакета 100% завршен  Jan 10, 2016
  4. Теме 75% завршен  Jan 10, 2016

Разно

  1. Модуларни Документи 100% завршен  Jan 10, 2016
  2. Заједничко писање LaTeX докумената 75% завршен  Jan 10, 2016
  3. Отпремање у друге формате 100% завршен  Jan 10, 2016

Помоћ и препоруке

  1. Најчешће постављана питања 100% завршен  Jan 10, 2016
  2. Савети и трикови 75% завршен  Jan 10, 2016

Додаци

  1. Аутори 0% завршен  Jan 10, 2016
  2. Линкови 0% завршен  Jan 10, 2016
  3. Ознаке пакета 0% завршен  Jan 10, 2016
  4. Примери LaTeX докумената 0% завршен  Jan 10, 2016
  5. Индекс 0% завршен  Jan 10, 2016
  6. Речник наредби 0% завршен  Jan 10, 2016

Документи производе са командама које сте научили до сад и они изгледају прихватљиво за велики део аудиторијума. Иако не изгледају фенси, они поштују сва утврђена правила и текстуални распоред, који их чини лаким за читање и пријатним за око. Међутим, постоје ситуације у којима 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}
  • Ово је Викикњига о LaTeX подржана од стране Wikimedia
  • Ово је Викикњига о LaTeX подржана од стране многих корисника!
  • Ово је Викикњига о LaTeX подржана од стране John Doe и Anthea Smith

Именујте своју нову команду \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}
  • Ово је Викикњига о LaTeX подржана од стране Wikimedia и John Doe!
  • Ово је Викикњига о LaTeX подржана од стране многих корисника и John Doe!
Напомена
Када се команда користи са експлицитним првим параметром, он је дат у загради (овде "[многих корисника]").

Ево једног честог примера: ако пишете књигу о Математици и морате да користите векторе, морате да одлучите како ће изгледати. Постоји неколико различитих стандарда, који се користе у многим књигама. Ако је 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 верзија боје документа би се направила.

Референцирање[уреди]


Претходно: Креирање 3D графике Индекс Следеће: Обичан ТеХ