Proceedings of the 12th Conference on Artficial Intelligence and Digital Communications AIDC, 5-7 october 2012, Pages 93–102
Representation and traversal of bipartite graphs in LATEX Petru-Ioan Becheru Abstract. LATEX is a macro-based language not suited for easy programming, such as intermediate or high-level languages (Pascal, C++, JavaScript), because it is designed mainly as a formatting and structuring language for text. In this article, we show a way to represent and traverse bipartite graphs in LATEX. The end of the material includes an example of bipartite graphs being used in the context of Romanian traditional style of typesetting of scientific articles. Key words and phrases. typesetting, Romanian traditional style, author, affiliation.
1. Introduction 1.1. Theoretical notions about graphs. 1.1.1. Definition of graphs. A graph is a pair G = (V, M ) with M ⊆ V × V and V ∩ M = ∅, where V is the vertices (nodes) set and M edge (lines) set. 1.1.2. Graph representation. Let n = |V |. Adjacency matrix. The square matrix A of order n, having 1 edge[i, j] ∈ M, A[i, j]i,j∈V = 0 edge[i, j] ∈ /M is called the adjacency matrix of graph G = (V, M ). Most programming languages have built-in support for vectors and matrices, which makes it easy to program using these structures. Neighbors list. For each node i ∈ V , his neighbors list is Li = {j ∈ V |[i, j] ∈ M }. Depending on the problem to solve and the programming language, list Li can be modeled as a list of items or as a array and L as an array of lists. 1.2. About bipartite graphs. 1.2.1. Definition of bipartite graphs. A graph G = (V, M ) is a bipartite graph if V allows a partition into two subsets V1 and V2 (V1 ∪ V2 = V and V1 ∩ V2 = ∅) so that each edge of the graph to has an end in V1 and the other in V2 or, in other words, no two adjacent vertices are in the same subset. Several properties of bipartite graphs can be found by consulting [2]. Specials thanks goes to Cristian Becheru for his continued support of my research. 93
94
P.-I. BECHERU
1.2.2. Bipartite graph representation. Let n = |V |, n1 = |V1 |, n2 = |V2 |. V1 ∪ V2 = V V1 ∩ V2 = ∅
⇒ n = n1 + n2
More than in 1.1.2, will need to represent the lists V1 and V2 . 1.3. About LATEX. According to [1], the impact of information and communication technologies in all fields of the society life determines people from industry, business and academia to be more interested in developing new models and methodologies, and to build software supporting the new paradigms in training, learning, and research. TEX is a macro-based created in the 1970s by D. Knuth in order to typeset “beautifully”, in the traditional style of the first editions of [10]—“The Art of Computer Programming”. TEX was expanded to create the possibility • a special focus on logical structure of the document and text formatting; • automatic numbering of sections and cross-references between them, making LATEX [12, 9]. LATEX is a macro-based language not suited for easy programming, such as intermediate or high-level languages (Pascal, C++, JavaScript), because it is designed mainly as a formatting and structuring language for text. LATEX lacks support for references, pointers, complex data structures (vectors, arrays, records) or variables of different types, everything has to be simulated using the definition and redefinition of macros and some integer variables (called ”counters”) that are used by LATEX to count sections and chapters of a book even language instructions (if, while) are designed as macros.For these reasons the development of software and debugging in LATEX are difficult operations which require a lot of carefulness. To overcome some of these problems package ifthen [6] was developed , providing support for: • \ ifthenelse{condition}{then clause}{else clause}; • logical variables by: – \newboolean{name} — creates a new logical variable, – \setboolean{name}{value} — assignes values to logical variables (value can be true or false), – \boolean{name} — gives the value of a logical variable (used to build conditions); • \whiledo{condition}{while clause}. 1.3.1. Short introduction to TEX. [11] is TEX main manual. TEX is a language based of definitions (macros). There are several types of macros: (1) basic commands (primitives) of TEX are those that can not be decomposed (expanded); (2) new definitions — macros defined using \def primitive. New definitions can be considered shortcuts for complex commands. For example[11, p.199], very often (x1 , . . . , xn ) we can define the \xvec macro as \def\xvec{(x_1,\dots,x_n)}. Consequently \xvec macro will be a shortcut or an abbreviation for(x_1,\dots,x_n). TEX supports grouping of commands. Grouping can be done using braces {} or \begingroup. . . \endgroup pair. The role of the group is that changes made within are not visible outside it. For example \it macro determines the text which will be
REPRESENTATION AND TRAVERSAL OF BIPARTITE GRAPHS IN LATEX
95
displayed using italics. To make only a part of the text to be written using italics text, the subtext is grouped: Anna {\it ha}s apples ⇒ Anna has apples TEX has support for registers that are used for arithmetic operations. TEX has 256 registers called \count0, . . . , \count255, each capable of taking integer values between 2 147 483 647 and +2 147 483 647. 1.3.2. TEX predefined macros. \ def. \def macro allows us to define new macros. The syntax is: \def {} where is the name of the (new) macro(e.g.\xvec), is a list of parameters (e.g. [#1]#2 for two parameters) and is the TEX code to replace the newly defined macro (e.g.: (x_1,\dots,x_n)#1). Because the parameters are numbered (#1, . . . , #9) and not named contribute to the poor readability of the code and the difficulty in debugging. Macros defined with \def are expanded when using the macro, not at definition point! \ edef. The \edef primitive has the same syntax as \def, difference between the two is that the \edef primitive expands the macro at definition point, this allows, for example, adding information to an existing macro. \ global. It is worth mentioning that the definitions made within a group are local to that group and not visible outside. If \global macro is placed before \def, new definition will be valid and visible outside the group. \ newcount. Since big applications use a large number of registers, there may be conflicts if, for example, \count123 is used at the same time by different macros in different purpose. For this reason, TEXhas an allocation mechanism using the \newcount macro that will designate and reserve an unused registry. The syntax is: \newcount\< countername > To assign a value to a counter, write its name followed by the value: \< numecontor > < valoare >\relax \ advance. To increase or decrease a counter use the following primitive: \advance< name > by < number > \ csname...\ endcsname. When TEX expands \csname, it reads until the corresponding \endcsname, expanding what it reads and interprets the result as a macro name.This mechanism is used to dynamically create macros. \ expandafter. Macro syntax is \expandafter< token >. TEX reads < token > without expand, then reads the next token and then the first token is placed before expansion. This macro is used in conjunction with \ csname...\ endcsname to dynamically create macros. \ ifnum. if statement with following syntax: \ifnum < integer − 1 >< R >< integer − 2 >< tex − code − 1 > [\else < tex − code − 2 >] \fi where < integer − 1 > and < integer − 2 > must be able to expand to integers, < R > must be one of the = characters. If < integer − 1 >< R >< integer − 2 > is true, then < tex − code − 1 > will run, else if we have \else macro < tex − code − 2 > is run.
96
P.-I. BECHERU
1.3.3. Short introduction to LATEX. \ @alph. @alph macro receives as a parameter a number or a register or a counter and expands to the alphabetical letter corresponding number, register or counter. E.g.: \@alph3 returns c. \ g@addto@macro. Receives two arguments, adding the first argument to the second one. 2. Bipartite graphs in LATEX 2.1. LATEX representation of bipartite graphs. Since language LATEX does not have native support for arrays, we will use the neighbors list representation simulated by dynamically creating macros: • we redefine the bipartite graph as: G = ((V1 × {A}) ∪ (V2 × {B}), V1 × V2 ), where V1 , V2 ⊂ N • a counter has |V1 |; • another counter has |V2 |; • for each i node of V1 : – a counter has the number of neighbors of i. This counter is equal to |Li | and it is dynamically created with the name prefixV1 + \@alphi – each neighbors j ∈ Li is stored in a dynamically created macro named: prefixV1 + \@alphi + sufixV2 + \@alphk where: ∗ prefixV1 and sufixV2 are predefined texts, ∗ k ∈ N, 0 ≤ k < |Li |, ∗ and + means concatenation. For example: let prefixV1 be X and sufixV2 be Y. In this case \XaYd will return the node from V2 that makes the fourth edge of the first vertice of V1 . 2.2. Defining a bipartite graph in LATEX. To define a bipartite graph macros are needed for: (1) inputting the elements of V2 . Implementation of the generic macro \addV2{label}{element} must increment the counter that stores |V2 | and must add element to V2 . Repeated calls of the generic macro will populate the V2 list. (2) inputting the elements of V1 inputting the edges. Implementation of the generic macro \addV1{element}{ \edgeTo{label_1} ... \edgeTo{label_k} } must increment the counter that stores |V1 |, and must add element to V1 and must add k elements of V2 set by label_1, . . . , label_k to neighbors list of the current node. Repeated calls of the generic macro will populate the V1 list.
REPRESENTATION AND TRAVERSAL OF BIPARTITE GRAPHS IN LATEX
97
2.3. Traversing bipartite graphs in LATEX. The traverse algorithm of bipartite graphs is: (1) a new i counter is created for iterating over V1 . i takes values between 0 and |V1 | − 1. (2) the \whiledo macro is used to iterate over V1 . For each element of V1 , we call a processing macro for the node. This macro can be redefined to change the standard behavior: neighbors list processing: (a) a new k counter is created for iterating over Li . k takes values between 0 and |Li | (b) the \whiledo macro is used to iterate over Li . For each element of Li , we process the edge determined by (i, \prefixV1 + \@alphi + sufixV2 + \@alphk) 3. Example of a bipartite graph An example of a bipartite graph is the graph of authors affiliation to institutions: Each author may be affiliated to at least one of the institutions listed in the article. Edges of the graph are pairs (author, institution) called affiliations. Depending on the typesetting style of publication1, the affiliation graph can be shown: • after each author we put references in footnotes that show the affiliations; • authors grouped by affiliation; • authors appear without affiliation. Because LATEX, such as HTML [7, 8], is a language for data formatting and it was not designed as a way to ease data structuring, when we extend the language by defining new macros, we should consider the possible future need for data extraction and processing (such a translating the LATEX code to another language). The following lines show an example of author-affiliation bipartite graph definition2: \ begin { au tori } \ n o t a {USMF}{USMF ‘ ‘ N i c o l a e Te st e m i t a n u ’ ’ Ch i si n a u , R e p u b l i c a Moldova}% \ n o t a {CatOMF}{ Ca t e d r a C h i r u r g i e OMF, S t o m a t o l o g i e O r t o p e d i c a s i I m p l a n t o l o g i e Orala } \ n o t a { CatProt }{ Ca t e d r a P r o p e d e u t i c a S t o m a t o l o g i e s i I m p l a n t o l o g i e Dentara } \ n o t a { M a st e r d e n t }{ C l i n i c a s t o m a t o l o g i c a ‘ ‘ M a st e r d e n t ’ ’ } \ b e g i n { Autor } \ t i t l u { Prof . \ univ . \ dr . } \Nume{ Topalo } \ prenume{ V a l e n t i n } \afilieri { \ a f i l i e r e {USMF} \ a f i l i e r e {CatOMF} \ a f i l i e r e { M a st e r d e n t } } \ end{ Autor } \ b e g i n { Autor } \ t i t l u { Conf . \ u n i v . \ d r . } \Nume{ Ch e l e } \ prenume{ N i c o l a e } \afilieri { \ a f i l i e r e {USMF} \ a f i l i e r e { CatProt } 1A set of typing rules form a typesetting style.[3] 2Note that Romanian terminology is used
98
P.-I. BECHERU
\ a f i l i e r e { M a st e r d e n t } } \ end{ Autor } \ end { a u t o r i }
Example of implementation: \ P r o v i d e s P a c k a g e{ a r t i c o l A u t o r i } \ edef\ autoriSep { , } \ makeatletter \ d e f \nume#1{{\ s c s h a p e #1}} \newcommand\ a d d t o A u t o r i L i s t a [ 1 ] { \ g@addto@macro\ a u t o r i L i s t a {#1}} \ newcount\ n r A u t o r i \ newcount\ nrNota \newcommand {\ @ i n i t A u t o r i }{ \ g l o b a l \ n r A u t o r i =0 \ g l o b a l \ nrNota=0 } \ NewEnviron{ a u t o r i }{ \ g l o b a l \ e d e f \ a u t o r i L i s t a {} \newcommand {\ a u t o r } [ 4 ] [ ] { \ ifnum \ n r A u t o r i >0 \ a d d t o A u t o r i L i s t a {\ a u t o r i S e p ##2 \nume{##3}} \ e l s e \ a d d t o A u t o r i L i s t a{##2 \nume{##3}} \ f i \ g l o b a l \ a d v a n c e\ n r A u t o r i by 1 \ i f t h e n e l s e {\ i se m p t y {##1}} {\ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname t i t l u A u t o r \ @alph\ n r A u t o r i \ endcsname {}} {\ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname t i t l u A u t o r \ @alph\ n r A u t o r i \ endcsname {##1˜}} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname prenumeAutor \ @alph\ n r A u t o r i \ endcsname{##2} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname numeAutor\ @alph\ n r A u t o r i \ endcsname{##3} \ i f t h e n e l s e {\ i se m p t y {##4}} {\ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname c o u n t e r N o t a A u t o r \ @alph\ n r A u t o r i \ endcsname {}} {\ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname c o u n t e r N o t a A u t o r \ @alph\ n r A u t o r i \ endcsname {\ csname ##4\endcsname }} } \newcommand {\ n o t a } [ 2 ] { \ g l o b a l \ a d v a n c e\ nrNota by 1 \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname Nota\ @alph\ nrNota \ endcsname{##2} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname ##1\endcsname {\ number\ nrNota } } \@initAutori \BODY } \ NewEnviron{ Autor }{ \ g l o b a l \ a d v a n c e\ n r A u t o r i by 1 \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname t i t l u A u t o r \ @alph\ n r A u t o r i \ endcsname {} \newcommand {\ t i t l u } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname t i t l u A u t o r \ @alph\ n r A u t o r i \ endcsname {##1˜}} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname prenumeAutor \ @alph\ n r A u t o r i \ endcsname {} \newcommand {\ prenume } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname prenumeAutor \ @alph\ n r A u t o r i \ endcsname{##1}} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname numeAutor\ @alph\ n r A u t o r i \ endcsname {} \newcommand {\Nume} [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname numeAutor\ @alph\ n r A u t o r i \ endcsname{##1}} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname a d r e s a A u t o r \ @alph\ n r A u t o r i \ endcsname {} \newcommand {\ a d r e s a } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname a d r e s a A u t o r \ @alph\ n r A u t o r i \ endcsname{##1}} \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname c o u n t e r N o t a A u t o r \ @alph\ n r A u t o r i \ endcsname {}
REPRESENTATION AND TRAVERSAL OF BIPARTITE GRAPHS IN LATEX
99
\newcommand {\ a f i l i e r e a } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname c o u n t e r N o t a A u t o r \ @alph\ n r A u t o r i \ endcsname {\ csname ##1\endcsname }} \newcommand {\ a f i l i e r i } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ newcount\ csname n r N o t e A u t o r\ @alph\ n r A u t o r i \ endcsname ##1 } \newcommand {\ a f i l i e r e } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ a d v a n c e\ csname n r N o t e A u t o r\ @alph\ n r A u t o r i \ endcsname by 1 \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname Autor \ @alph\ n r A u t o r i Nota\ e x p a n d a f t e r \ @alph\ csname n r N o t e A u t o r\ @alph\ n r A u t o r i \ endcsname \ endcsname {\ csname ##1\endcsname } } \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname f b o x A u t o r \ @alph\ n r A u t o r i \ endcsname { f a l s e } \newcommand {\ f b o x A u t o r } [ 1 ] { \ g l o b a l \ e x p a n d a f t e r \ e d e f \ csname f b o x A u t o r \ @alph\ n r A u t o r i \ endcsname{##1}} \BODY \ g l o b a l \ e d e f \ p r e n u m e l e {\ getPrenumeAutor{\ n r A u t o r i }} \ g l o b a l \ e d e f \ numele{\ getNumeAutor{\ n r A u t o r i }} \ g l o b a l \ e d e f \ a d d t o A u t o r i L i s t a S{\ a u t o r i S e p \ getPrenumeAutor{\ n r A u t o r i } {\ getNumeAutor{\ n r A u t o r i }}} \ g l o b a l \ e d e f \ a d d t o A u t o r i L i s t a N o S{\ getPrenumeAutor{\ n r A u t o r i } {\ getNumeAutor{\ n r A u t o r i }}} \ ifnum \ n r A u t o r i >1 \ g l o b a l \ e d e f \ a u t o r i L i s t a {\ a u t o r i L i s t a \ a d d t o A u t o r i L i s t a S} \ else \ g l o b a l \ e d e f \ a u t o r i L i s t a {\ a u t o r i L i s t a \ a d d t o A u t o r i L i s t a N o S}
}
\fi
\newcommand {\ g e t T i t l u A u t o r } [ 1 ] { \ e x p a n d a f t e r \ csname t i t l u A u t o r \ @alph#1\endcsname } \newcommand {\ getPrenumeAutor } [ 1 ] { \ e x p a n d a f t e r \ csname prenumeAutor \ @alph#1\endcsname } \newcommand {\ getNumeAutor } [ 1 ] { \ e x p a n d a f t e r \ csname numeAutor\ @alph#1\endcsname } \newcommand {\ g e t A d r e sa A u t o r } [ 1 ] { \ e x p a n d a f t e r \ csname a d r e s a A u t o r \ @alph#1\endcsname } \newcommand {\ getNrNotaAutor } [ 1 ] { \ e x p a n d a f t e r \ csname c o u n t e r N o t a A u t o r \ @alph#1\endcsname } \newcommand {\ g e t N r N o t e A u t o r } [ 1 ] { \ e x p a n d a f t e r \ csname n r N o t e A u t o r\ @alph#1\endcsname } \newcommand {\ g e t A u t o r N o t a } [ 2 ] { \ e x p a n d a f t e r \ csname Autor\ @alph#1Nota\ @alph#2\endcsname } \newcommand {\ getFboxAutor } [ 1 ] { \ e x p a n d a f t e r \ csname f b o x A u t o r \ @alph#1\endcsname } \newcommand {\ g e t N o t a } [ 1 ] { \ e x p a n d a f t e r \ csname Nota\ @alph#1\endcsname }
100
P.-I. BECHERU
\ makeatother \newcommand {\ si m b o l N o t a D e S u b so l P t A u t o r } [ 1 ] {\ e n su r e m a t h{ˆ{\mathrm{\ f n sy m b o l {#1}}}}} \newcommand {\ g e t F u l l A u t o r } [ 1 ] { \ g e t T i t l u A u t o r{#1} \ getPrenumeNumeAutor {#1} } \newcommand {\ getPrenumeNumeAutor } [ 1 ] { \ i f t h e n e l s e {\ b o o l e a n {\ getFboxAutor {#1}}} { \ s e t l e n g t h \ f b o x s e p {1 p t } \ s e t l e n g t h \ f b o x r u l e { 0 . 2 dd} \ f b o x {\ getPrenumeAutor{#1} \nume{\ getNumeAutor{#1}}} \ defaultFBox } else { \ getPrenumeAutor{#1} \nume{\ getNumeAutor{#1}} } } \newcommand {\ g e t A u t o r i O n A u t o r } [ 1 ] { \mbox{ \ g e t F u l l A u t o r{#1} \ begingroup \ newcount\ n o t a I t e r a t o r \ n o t a I t e r a t o r=0 \renewcommand {\ t h e f o o t n o t e }{\ si m b o l N o t a D e S u b so l P t A u t o r{ f o o t n o t e }} \ w h i l e d o {\ n o t \ e q u a l {\ t h e \ n o t a I t e r a t o r }{\ t h e \ g e t N r N o t e A u t o r{#1}}} { \ a d v a n c e\ n o t a I t e r a t o r by 1 \ f o o t n o t e m a r k [ \ g e t A u t o r N o t a {#1}{\ n o t a I t e r a t o r } ] } \renewcommand {\ t h e f o o t n o t e }{\ a r a b { f o o t n o t e }} \ endgroup } } \newcommand {\ g e t A u t o r i } [ 3 ] { #1 \begingroup \ newcount\ a u t o r I t e r a t o r \ a u t o r I t e r a t o r =0 \ w h i l e d o {\ n o t \ e q u a l {\ t h e \ a u t o r I t e r a t o r }{\ t h e \ n r A u t o r i }} { \ a d v a n c e\ a u t o r I t e r a t o r by 1 \ ifnum \ a u t o r I t e r a t o r >1 #2\ f i \ g e t A u t o r i O n A u t o r{\ a u t o r I t e r a t o r } } \ endgroup #3 } \newcommand {\ g e t A u t o r i O f N o t a } [ 4 ] { #2 \begingroup \ newcount\ a u t o r I t e r a t o r \ a u t o r I t e r a t o r =0 \ newcount\ p r i n t e d A u t o r I t e r a t o r \ p r i n t e d A u t o r I t e r a t o r=0 \ w h i l e d o {\ n o t \ e q u a l {\ t h e \ a u t o r I t e r a t o r }{\ t h e \ n r A u t o r i }} { \ a d v a n c e\ a u t o r I t e r a t o r by 1 \ ifnum \ getNrNotaAutor {\ a u t o r I t e r a t o r }=#1
REPRESENTATION AND TRAVERSAL OF BIPARTITE GRAPHS IN LATEX
\fi } \ endgroup #4 }
101
\ a d v a n c e\ p r i n t e d A u t o r I t e r a t o r by 1 \ ifnum \ p r i n t e d A u t o r I t e r a t o r >1 #3\ f i \mbox{\ g e t F u l l A u t o r {\ a u t o r I t e r a t o r }}
\newcommand {\ getNoteOnNota } [ 2 ] { # 1 } \newcommand {\ g e t N o t e }{ \begingroup \renewcommand {\ t h e f o o t n o t e }{\ si m b o l N o t a D e S u b so l P t A u t o r{ f o o t n o t e }} \ newcount\ n o t a I t e r a t o r \ n o t a I t e r a t o r=0 \ w h i l e d o {\ n o t \ e q u a l {\ t h e \ n o t a I t e r a t o r }{\ t h e \ nrNota }} { \ a d v a n c e\ n o t a I t e r a t o r by 1 \ getNoteOnNota {\ g e t N o t a {\ n o t a I t e r a t o r }}{\ n o t a I t e r a t o r } } \renewcommand {\ t h e f o o t n o t e }{\ a r a b { f o o t n o t e }} \ endgroup }
\ renewcommand {\ getNoteOnNota } [ 2 ] { \ f o o t n o t e t e x t [#2]{#1} }
4. Conclusions LATEX is an excellent formatting and typesetting language, but programming is difficult, requiring tricks. Due to the high quality of the output and the huge number of packages available, LATEX is the preferred language for typesetting scientific documents. Considering that, in most cases, LATEX is not used in the printing industry, typesetting style underwent continuous degradation [4], typesetting using LATEX being a solution to stop this phenomenon. This material is part of the effort ([5, 4, 3] etc) to create a LATEX package collection able of outputting a Romanian typesetting styled document. References [1] G. Albeanu and M. Vlada, New Results on E-Learning Methodologies, An. Univ. Spiru Haret ser. matemat.-inform. 6 (2010), no. 2, 5-6. [2] A.S. Asratian, T.M.J. Denley and R. H¨ aggkvist, Bipartite Graphs and their Applications, Cambridge Tracts in Mathematics, 1998. [3] P.-I. Becheru, Correcting Romanian typesetting mistakes by using regular expressions, An. Univ. Spiru Haret ser. matemat.-inform. 7 (2011), no. 2, 31-36. [4] P.I. Becheru, Impact of the Romanian typesetting style degradation on the quality of publications, Optim. Q 22 (2011), no. 3-4, 69-74. [5] P.-I. Becheru and A. Haidari, Revista noastra la al X-lea Congres al Societatii Romane de Chirurgie Orala si Maxilo-Faciala, Rev. chir. oro-maxilo-fac. implantol. 2 (2011), no. 2, 1-2. [6] H. Carlisle, The ifthen package, 2001. [7] M. Cosulschi, N. Constantinescu and M. Gabroveanu, Classification and comparison of information structures from a web page, Annals of University of Craiova, Math. Comp. Sci. Ser. 31, (2004), 109-121.
102
P.-I. BECHERU
[8] M. Cosulschi, A. Giurca, B. Udrescu, N. Constantinescu and M. Gabroveanu, HTML Pattern Generator–Automatic Data Extraction from Web Pages, Symbolic and Numeric Algorithms for Scientific Computing, 2006, SYNASC’06. Eighth International Symposium on, 2006, 75-78. auser, 2000. [9] G.A. Gr¨ atzer, Math into LATEX, Birkh¨ [10] D.E. Knuth, Digital typography, CSLI lecture notes, 1999. [11] D.E. Knuth, The TeXbook, Addison–Wesley, 1986. [12] L. Lamport, LATEX: A Document Preparation System, Addison–Wesley, 1986. (Petru-Ioan Becheru) Faculty of Exact Sciences, University of Craiova, 13 A.I. Cuza Street, Craiova, 200585, Romania E-mail address:
[email protected]