From 509afb5e25b127bfb742d229a078dff291caf17f Mon Sep 17 00:00:00 2001 From: Mart Lubbers Date: Wed, 3 Dec 2014 10:37:35 +0100 Subject: [PATCH] everything till graphs --- thesis2/1.introduction.tex | 205 +++++----- thesis2/LICENSE | 416 ++++++++++++++++++++ thesis2/README | 23 ++ thesis2/README.md | 4 + thesis2/graphviz.dtx | 500 +++++++++++++++++++++++++ thesis2/graphviz.ins | 49 +++ thesis2/graphviz.sty | 106 ++++++ thesis2/test/Makefile | 40 ++ thesis2/test/body.tex | 9 + thesis2/test/pdf-singlefile-tmpdir.tex | 3 + thesis2/test/pdf-singlefile.tex | 3 + thesis2/test/pdf-tmpdir.tex | 3 + thesis2/test/pdf.tex | 3 + thesis2/test/ps.tex | 3 + thesis2/version/mart_thesis_0.3.tar | Bin 0 -> 40960 bytes 15 files changed, 1268 insertions(+), 99 deletions(-) create mode 100644 thesis2/LICENSE create mode 100644 thesis2/README create mode 100644 thesis2/README.md create mode 100644 thesis2/graphviz.dtx create mode 100644 thesis2/graphviz.ins create mode 100644 thesis2/graphviz.sty create mode 100644 thesis2/test/Makefile create mode 100644 thesis2/test/body.tex create mode 100644 thesis2/test/pdf-singlefile-tmpdir.tex create mode 100644 thesis2/test/pdf-singlefile.tex create mode 100644 thesis2/test/pdf-tmpdir.tex create mode 100644 thesis2/test/pdf.tex create mode 100644 thesis2/test/ps.tex create mode 100644 thesis2/version/mart_thesis_0.3.tar diff --git a/thesis2/1.introduction.tex b/thesis2/1.introduction.tex index c9c359c..0ad4c5b 100644 --- a/thesis2/1.introduction.tex +++ b/thesis2/1.introduction.tex @@ -78,28 +78,28 @@ information flow. \scalebox{0.7}{ \digraph[]{graph111}{ rankdir=TB; - node [shape="rectangle",fontsize=10,nodesep=0.7,ranksep=0.75,width=1] - edge [weight=5.] - i0 [label="Website"] - i1 [label="Email"] - i2 [label="Fax"] - i3 [label="RSS/Atom"] - p1 [label="Preproccessing"] - p2 [label="Temporum: Postproccesing"] - o1 [label="Database: Insertion"] - o2 [label="TheAgenda"] - o3 [label="BiosAgenda"] - o4 [label="..."] - p1, p2, o1 [width=5]; - i0 -> p1 - i1 -> p1 - i2 -> p1 - i3 -> p1 - p1 -> p2 - p2 -> o1 - o1 -> o2 - o1 -> o3 - o1 -> o4 + node [shape="rectangle",fontsize=10,nodesep=0.7,ranksep=0.75,width=1]; + edge [weight=5.]; + i0 [label="Website"]; + i1 [label="Email"]; + i2 [label="Fax"]; + i3 [label="RSS/Atom"]; + p1 [label="Preproccessing"]; + p2 [label="Temporum: Postproccesing"]; + o1 [label="Database: Insertion"]; + o2 [label="TheAgenda"]; + o3 [label="BiosAgenda"]; + o4 [label="..."]; + node [width=5]; p1 p2 o1; + i0 -> p1; + i1 -> p1; + i2 -> p1; + i3 -> p1; + p1 -> p2; + p2 -> o1; + o1 -> o2; + o1 -> o3; + o1 -> o4; } } \end{figure} @@ -116,13 +116,13 @@ the following fields: a very broad definition. In practice it can be describing the concert tour name, theater show title, movie title, festival title and many more. \item[Where] - The \textit{Where} field is the location of the event. This is ofter - omitted because the organization think it is obvious. This field can also - include different sublocations. For example when a pop concert venue has - their own building but in the summer they organize a festival in some park. - This data is often assumed to be trivial and inherent but in practice this - is not the case. In this example for an outsider only the name of the park - is often not enough. + The \textit{Where} field is the location of the event. The location is often + omitted because the organization behind source presenting the information + think it is obvious. This field can also include different sublocations. + For example when a pop concert venue has their own building but in the + summer they organize a festival in some park. This data is often assumed + to be trivial and inherent but in practice this is not the case. In this + example for an outsider only the name of the park is often not enough. \item[When] The \textit{When} field is the time and date of the event. Hyperleap wants to have at minimum the date, start time and end time. In the field end @@ -161,30 +161,33 @@ the full information he has to tap in different resources which might not always be available. \paragraph{Crawler} -The second steps is the crawling of the websites. This happens currently in a -couple of methods. Some sites are very structured and a programmer creates a -program that can visit the website systematically and extract that information. -Some other sources are very hard to programmatically crawled and they are -visited by employees. The programmed crawlers are always specifically created -for one or a couple sources and when the source changes for example structure -the programmer has to adapt the crawler which is costly. Information from the -different crawlers then goes to the \textit{Temporum}. +When the source has been determined and classified the next step is +periodically crawling the source. At the moment the crawling happens using a +couple of different methods. Some sites are very structured and a programmer +creates a program that can visit the website systematically and extract that +information. Some other sources are very hard to programmatically crawled and +they are visited by employees. The programmed crawlers are always specifically +created for one or a couple sources and when the source changes for example +structure the programmer has to adapt the crawler which is costly. Information +from the different crawlers then goes to the \textit{Temporum}. \paragraph{Temporum} The \textit{Temporum} is a big bin that contains raw data extracted from different sources and has to be post processed to be suitable enough for the -actual database. This processing encompasses several possible tasks. The first -task is to check the validity of the entry. This is a very shallow test to -check if the crawler is not malfunctioning and there is no nonsense in the -data. Most of the data is not directly checked for validity, the data is -skimmed for strange things but not every datapoint is checked. The second step -is matching the entry to several objects. For example the entry has to be -matched to a certain venue when its source is a ticket vendor who sells tickets -for multiple venues. Another example is that the event is a pop concert and is -part of a big tour. Many of these tasks are done alone by or with aid of a -computer program. Almost no data is going straight through the -\textit{Temporum} and this property makes the \textit{Temporum} a safety net -for all the incoming data. +actual database. This post-processing encompasses several possible tasks. The +first task is to check the validity of the entry. This is not done for every +entry but random samples are taken and these entries will be tested to see +if the crawler is not malfunctioning and there is no nonsense in the +data. +The second step is matching the entry to several objects. Objects in the +broadest sense can basically be anything, in the case of a theater show +performance the matched object can be the theater show itself, describing the +show for all locations. In case of a concert it can be that the object is a +tour the band is doing. When the source is a ticket vendor the object is the +venue where the event takes place since the source itself is not a venue. +Many of these tasks are done by a human or with aid of a computer program. +The \textit{Temporum} acts as a safety net because no data is going straigt +through to the database. It is first checked, matched and validated. \paragraph{Database \& Publication} When the data is post processed it is entered in the final database. The @@ -197,16 +200,18 @@ presented in the form of trivia, photos, interviews, reviews, previews and much more. \section{Goal \& Research question} -The second step in the information flow is crawling the sources and apply the -preprocessing. This is a expensive task because it requires a programmer to be -hired because currently all crawlers are programmed for one, or a couple, -specific sources. Because a big group of sources often changes this very -expensive and has a long feedback loop. When a source changes it is first -preprocessed in the old way, send to the \textit{Temporum} and checked by a -human and matched. The human then notices the error in the data and contacts -the programmer. The programmer then has to reprogram the specific crawler to -the new structure. This feedback loop, shown in Figure~\ref{feedbackloop} can -take days and can be the reason for gaps or faulty information in the database. +Crawling the sources and applying the preprocessing is the most expensive task +in the entire information flow because it requires a programmer to be hired. +Only programmers currently can create crawlers and design preprocessing jobs +because all current programs are specifically designed to do one thing, most of +the time for one source. Because a big group of sources often changes this task +becomes very expensive and has a long feedback loop. When a source changes the +source is first preprocessed in the old way, send to the \textit{Temporum} and +checked by a human and matched. The human then notices the error in the data +and contacts the programmer. The programmer then has to reprogram the specific +crawler to the new structure. This feedback loop, shown in +Figure~\ref{feedbackloop} can take days and can be the reason for gaps and +faulty information in the database. \begin{figure}[H] \caption{Feedback loop for malfunctioning crawlers} \label{feedbackloop} @@ -214,20 +219,20 @@ take days and can be the reason for gaps or faulty information in the database. \scalebox{0.5}{ \digraph[]{graph112}{ rankdir=LR; - node [shape="rectangle"] - source [label="Source"] - crawler [label="Crawler"] - temporum [label="Temporum"] - user [label="User"] - programmer [label="Programmer"] - database [label="Database"] - source -> crawler - crawler -> temporum - temporum -> user - user -> database - user -> programmer [constraint=false,style="dotted"] - user -> crawler [constraint=false,style="dashed"] - programmer -> crawler [constraint=false,style="dotted"] + node [shape="rectangle"]; + source [label="Source"]; + crawler [label="Crawler"]; + temporum [label="Temporum"]; + employee [label="User"]; + programmer [label="Programmer"]; + database [label="Database"]; + source -> crawler; + crawler -> temporum; + temporum -> user; + user -> database; + user -> programmer [constraint=false,style="dotted"]; + user -> crawler [constraint=false,style="dashed"]; + programmer -> crawler [constraint=false,style="dotted"]; } } \end{figure} @@ -238,16 +243,18 @@ for someone without programming experience. In practice this means in Figure~\ref{feedbackloop} removing the dotted arrows by dashed arrow. For this project an application has been developed that can provide an -interface to a crawler system that is able to crawl RSS\cite{Rss} and -Atom\cite{Atom} publishing feeds. The interface also provides the user with -point and click interfaces to create, modify, test and remove crawlers. The -Hyperleap back end can, via this interface, generate XML feeds that contain the -crawled data. For editing the structure and contents of the program a -programmer is in theory also not necessary because all the things someone wants -to change are located in a single file that is human readable. In practice it -means that one person, not by definition a programmer, can be instructed to -change the structure and this can also greatly reduce programmer intervention -time. +interface to a crawler generation system that is able to crawl RSS\cite{Rss} +and Atom\cite{Atom} publishing feeds. The interface provides the user with +point and click interfaces meaning that no computer science background is +needed to use the interface, to create, modify, test and remove crawlers. The +current Hyperleap backend system that handles the data can, via an interface, +generate XML feeds that contain the crawled data. The structure of the +application is very modular and generic and therefore it is easy to change +things in the program without having to know a lot about the programming +language used. This is because for example all visual things like buttons are +defined in a human readable text file. In practice it means that one person, +not by definition a programmer, can be instructed to change the structure and +this can also greatly reduce programmer intervention time. \section{RSS/Atom} RSS/Atom feeds, from now on called RSS feeds, are publishing feeds in the XML @@ -270,7 +277,7 @@ Netherlands. \xmlcode{exrss.xml} \end{listing} -The RSS feeds are mostly used by news sites to publish their articles, the feed +RSS feeds are mostly used by news sites to publish their articles, the feed then only contains the headlines and if the user that is reading the feed is interested he can click the so called deeplink and he is then sent to the full website containing the article. Users often use programs that bundle user @@ -326,10 +333,10 @@ Figure~\ref{graphexample} is specified as: \centering \scalebox{0.7}{ \digraph[]{graphexample}{ - rankdir=LR - n1 -> n2 [dir="none"] - n2 -> n3 [dir="none"] - n2 -> n3 [dir="none"] + rankdir=LR; + n1 -> n2 [dir="none"]; + n2 -> n3 [dir="none"]; + n2 -> n3 [dir="none"]; } } \end{figure} @@ -354,9 +361,9 @@ $$G=(\{n1, n2\}, \{(n1, n2), (n2, n1)\}$$ \centering \scalebox{0.7}{ \digraph[]{dgexample}{ - rankdir=LR - n1 -> n2 - n2 -> n1 + rankdir=LR; + n1 -> n2; + n2 -> n1; } } \end{figure} @@ -377,13 +384,13 @@ graph to $\mathcal{O}(L)$ where $L$ is the length of the sequence. \centering \scalebox{0.7}{ \digraph[]{dagexample}{ - rankdir=LR - n01 -> n02 - n02 -> n03 - n03 -> n01 - n11 -> n12 - n12 -> n13 - n12 -> n14 + rankdir=LR; + n01 -> n02; + n02 -> n03; + n03 -> n01; + n11 -> n12; + n12 -> n13; + n12 -> n14; } } \end{figure} @@ -420,7 +427,7 @@ length of the word. \scalebox{0.7}{ \digraph[]{graph21}{ rankdir=LR; - n1,n2,n3,n4,n5 [shape="circle"]; + node [shape="circle"]; n1 n2 n3 n4 n5; n6 [shape="doublecircle"]; n1 -> n2 [label="a"]; n2 -> n3 [label="b"]; diff --git a/thesis2/LICENSE b/thesis2/LICENSE new file mode 100644 index 0000000..2244313 --- /dev/null +++ b/thesis2/LICENSE @@ -0,0 +1,416 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + Everyone is allowed to distribute verbatim copies of this + license document, but modification of it is not allowed. + + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under +which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright +and which you wish to distribute. This license may be particularly +suitable if your work is TeX-related (such as a LaTeX package), but +it is written in such a way that you can use it even if your work is +unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', +below, gives instructions, examples, and recommendations for authors +who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed +and modified, as well as conditions under which modified versions of +that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you +the freedom to make and distribute modified versions of your work +that conform with whatever technical specifications you wish while +maintaining the availability, integrity, and reliability of +that work. If you do not see how to achieve your goal while +meeting these conditions, then read the document `cfgguide.tex' +and `modguide.tex' in the base LaTeX distribution for suggestions. + + +DEFINITIONS +=========== + +In this license document the following terms are used: + + `Work' + Any work being distributed under this License. + + `Derived Work' + Any work that under any applicable law is derived from the Work. + + `Modification' + Any procedure that produces a Derived Work under any applicable + law -- for example, the production of a file containing an + original file associated with the Work or a significant portion of + such a file, either verbatim or with modifications and/or + translated into another language. + + `Modify' + To apply any procedure that produces a Derived Work under any + applicable law. + + `Distribution' + Making copies of the Work available from one person to another, in + whole or in part. Distribution includes (but is not limited to) + making any electronic components of the Work accessible by + file transfer protocols such as FTP or HTTP or by shared file + systems such as Sun's Network File System (NFS). + + `Compiled Work' + A version of the Work that has been processed into a form where it + is directly usable on a computer system. This processing may + include using installation facilities provided by the Work, + transformations of the Work, copying of components of the Work, or + other activities. Note that modification of any installation + facilities provided by the Work constitutes modification of the Work. + + `Current Maintainer' + A person or persons nominated as such within the Work. If there is + no such explicit nomination then it is the `Copyright Holder' under + any applicable law. + + `Base Interpreter' + A program or process that is normally needed for running or + interpreting a part or the whole of the Work. + + A Base Interpreter may depend on external components but these + are not considered part of the Base Interpreter provided that each + external component clearly identifies itself whenever it is used + interactively. Unless explicitly specified when applying the + license to the Work, the only applicable Base Interpreter is a + `LaTeX-Format' or in the case of files belonging to the + `LaTeX-format' a program implementing the `TeX language'. + + + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work +are not covered by this license; they are outside its scope. In +particular, the act of running the Work is not restricted and no +requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you +received it. Distribution of only part of the Work is considered +modification of the Work, and no right to distribute such a Derived +Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a +complete, unmodified copy of the Work as distributed under Clause 2 +above, as long as that Compiled Work is distributed in such a way that +the recipients may install the Compiled Work on their system exactly +as it would have been installed if they generated a Compiled Work +directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without +restriction, modify the Work, thus creating a Derived Work. You may +also distribute the Derived Work without restriction, including +Compiled Works generated from the Derived Work. Derived Works +distributed in this manner by the Current Maintainer are considered to +be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify +your copy of the Work, thus creating a Derived Work based on the Work, +and compile this Derived Work, thus creating a Compiled Work based on +the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may +distribute a Derived Work provided the following conditions are met +for every component of the Work unless that component clearly states +in the copyright notice that it is exempt from that condition. Only +the Current Maintainer is allowed to add such statements of exemption +to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement + for a component of the Work when that component is used with the + Base Interpreter, then, wherever this component of the Work + identifies itself to the user when used interactively with that + Base Interpreter, the replacement component of this Derived Work + clearly and unambiguously identifies itself as a modified version + of this component to the user when used interactively with that + Base Interpreter. + + b. Every component of the Derived Work contains prominent notices + detailing the nature of the changes to that component, or a + prominent reference to another file that is distributed as part + of the Derived Work and that contains a complete and accurate log + of the changes. + + c. No information in the Derived Work implies that any persons, + including (but not limited to) the authors of the original version + of the Work, provide any support, including (but not limited to) + the reporting and handling of errors, to recipients of the + Derived Work unless those persons have stated explicitly that + they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; + if your distribution of a modified component is made by + offering access to copy the modified component from a + designated place, then offering equivalent access to copy + the Work from the same or some similar place meets this + condition, even though third parties are not compelled to + copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, + unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may +distribute a Compiled Work generated from a Derived Work, as long as +the Derived Work is distributed to all recipients of the Compiled +Work, and as long as the conditions of Clause 6, above, are met with +regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not +apply to, the modification, by any method, of any component so that it +becomes identical to an updated version of that component of the Work as +it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative +format, where the Work or that Derived Work (in whole or in part) is +then produced by applying some process to that format, does not relax or +nullify any sections of this license as they pertain to the results of +applying that process. + +10. a. A Derived Work may be distributed under a different license + provided that license itself honors the conditions listed in + Clause 6 above, in regard to the Work, though it does not have + to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that + Derived Work must provide sufficient documentation as part of + itself to allow each recipient of that Derived Work to honor the + restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to +the Work, nor does this license place any restrictions on aggregating +such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent +complete compliance by all parties with all applicable laws. + + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in +writing, the Copyright Holder provides the Work `as is', without +warranty of any kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and fitness for a +particular purpose. The entire risk as to the quality and performance +of the Work is with you. Should the Work prove defective, you assume +the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing +will The Copyright Holder, or any author named in the components of the +Work, or any other party who may distribute and/or modify the Work as +permitted above, be liable to you for damages, including any general, +special, incidental or consequential damages arising out of any use of +the Work or out of inability to use the Work (including, but not limited +to, loss of data, data being rendered inaccurate, or losses sustained by +anyone as a result of any failure of the Work to operate with any other +programs), even if the Copyright Holder or said author or said other +party has been advised of the possibility of such damages. + + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder +explicitly and prominently states near the primary copyright notice in +the Work that the Work can only be maintained by the Copyright Holder +or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer +who has indicated in the Work that they are willing to receive error +reports for the Work (for example, by supplying a valid e-mail +address). It is not required for the Current Maintainer to acknowledge +or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there +is no Current Maintainer, or the person stated to be Current +Maintainer of the work cannot be reached through the indicated means +of communication for a period of six months, and there are no other +significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with +any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of +the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and + the Copyright Holder, if the two differ) through the means of + an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work + is still maintained. + + a. If it is being maintained, then ask the Current Maintainer + to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active + maintenance is taken by the Current Maintainer, then announce + within the pertinent community your intention to take over + maintenance. (If the Work is a LaTeX work, this could be + done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass + maintenance of the Work to you, then this takes effect + immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright + Holder agrees that maintenance of the Work be passed to you, + then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above + and after three months your intention is challenged neither by + the Current Maintainer nor by the Copyright Holder nor by other + people, then you may arrange for the Work to be changed so as + to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes + reachable once more within three months of a change completed + under the terms of 3b) or 4), then that Current Maintainer must + become or remain the Current Maintainer upon request provided + they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact +that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should +immediately provide, within the Work, a prominent and unambiguous +statement of your status as Current Maintainer. You should also +announce your new status to the same pertinent community as +in 2b) above. + + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and +recommendations for authors who are considering distributing their +works under this license. These authors are addressed as `you' in +this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* +conditions that differ significantly from those in this license, then +do not refer to this license anywhere in your work but, instead, +distribute your work under a different license. You may use the text +of this license as a model for your own license, but your license +should not refer to the LPPL or otherwise give the impression that +your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains +the motivation behind the conditions of this license. It explains, +for example, why distributing LaTeX under the GNU General Public +License (GPL) was considered inappropriate. Even if your work is +unrelated to LaTeX, the discussion in `modguide.tex' may still be +relevant, and authors intending to distribute their works under any +license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own +personal use, without also meeting the above conditions for +distributing the modified component. While you might intend that such +modifications will never be distributed, often this will happen by +accident -- you may forget that you have modified that component; or +it may not occur to you when allowing others to access the modified +version that you are thus distributing it and violating the conditions +of this license in ways that could have legal implications and, worse, +cause problems for the community. It is therefore usually in your +best interest to keep your copy of the Work identical with the public +one. Many works provide ways to control the behavior of that work +without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both +an explicit copyright notice including your name and the year the work +was authored and/or last substantially modified. Include also a +statement that the distribution and/or modification of that +component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions +given in this license document would apply, with the `Work' referring +to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being +generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' +referring to any `LaTeX-Format', and both `Copyright Holder' and +`Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your +Work, change `maintained' above into `author-maintained'. +However, we recommend that you use `maintained', as the Maintenance +section was added in order to ensure that your Work remains useful to +the community even when you can no longer maintain and support it +yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and +stability for the user community. They therefore concern themselves +with the case that a Derived Work is intended to be used as a +(compatible or incompatible) replacement of the original Work. If +this is not the case (e.g., if a few lines of code are reused for a +completely different task), then clauses 6b and 6d shall not apply. + + +Important Recommendations +------------------------- + + Defining What Constitutes the Work + + The LPPL requires that distributions of the Work contain all the + files of the Work. It is therefore important that you provide a + way for the licensee to determine which files constitute the Work. + This could, for example, be achieved by explicitly listing all the + files of the Work near the copyright notice of each file or by + using a line such as: + + % This work consists of all files listed in manifest.txt. + + in that place. In the absence of an unequivocal list it might be + impossible for the licensee to determine what is considered by you + to comprise the Work and, in such a case, the licensee would be + entitled to make reasonable conjectures as to which files comprise + the Work. + diff --git a/thesis2/README b/thesis2/README new file mode 100644 index 0000000..6254ec7 --- /dev/null +++ b/thesis2/README @@ -0,0 +1,23 @@ +This package has a little macro that lets you write directed graphs in +graphviz/dot syntax inside your LaTeX files, and have the rendered +version automatically included. For example: + + \digraph[scale=0.5]{abc}{rankdir=LR; a->b; b->c} + +Will result in three ovals in a row, labeled "a", "b", and "c", +respectively. There are some details and known limitations described +in the documentation. + + +Distributed files include: + + README -- this file + graphviz.pdf -- pre-compiled documentation + graphviz.dtx -- full source (generates .sty and .dvi/.pdf) + graphviz.ins -- used to extract .sty from .dtx + Makefile -- may be used to generate .sty and .pdf + + +Thanks to Scott Pakin for writing the tutorial on how to create .dtx +and .ins files. + diff --git a/thesis2/README.md b/thesis2/README.md new file mode 100644 index 0000000..d19909c --- /dev/null +++ b/thesis2/README.md @@ -0,0 +1,4 @@ +graphviz.sty +============ + +LaTeX package to write Graphviz (dot) files inline diff --git a/thesis2/graphviz.dtx b/thesis2/graphviz.dtx new file mode 100644 index 0000000..5380bb6 --- /dev/null +++ b/thesis2/graphviz.dtx @@ -0,0 +1,500 @@ +% \iffalse meta-comment +% +% Copyright (C) 2003-2013 by Derek Rayside +% -------------------------------------------------- +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, either version 1.3 of this license +% or (at your option) any later version. The latest version of this +% license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 1999/12/01 or later. +% +% \fi +% +% \iffalse +%\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%\ProvidesPackage{graphviz} +% [2013/08/15 v0.94 .dtx graphviz file] +% +%<*driver> +\documentclass{ltxdoc} +\RequirePackage[psfrag]{graphviz} +\RequirePackage{url} +\RequirePackage{calc} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{graphviz.dtx} +\end{document} +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% +% +% \changes{v0.1}{2003/11/24}{Initial version} +% \changes{v0.4}{2004/05/14}{converted to dtx format} +% \changes{v0.5}{2004/05/19}{renamed package to \textsf{dotla}} +% \changes{v0.7}{2005/12/29}{renamed package back to \textsf{graphviz}} +% +% \GetFileInfo{graphviz.sty} +% +% \DoNotIndex{\newcommand,\newenvironment} +% +% +% \title{\vspace*{-0.5in}The \textsf{graphviz} package\thanks{This document +% corresponds to \textsf{graphviz}~\fileversion, dated \filedate.}} +% \author{Derek Rayside $\langle$\texttt{drayside@uwaterloo.ca}$\rangle$ \\ +% with contributions from +% Ralf Hemmecke $\langle$\texttt{ralf@hemmecke.de}$\rangle$ } +% +% \maketitle +% +% \setlength{\parskip}{1ex} +% \setlength{\parindent}{0ex} +% +% \section{Introduction} +% +% \textsf{graphviz.sty} is a \LaTeX\ package for writing +% \textsf{graphviz/dot/neato} graphs inside of \LaTeX\ documents. +% \textsf{graphviz.sty} was inspired by a feature that Daniel Jackson added +% to his \textsf{tagger} text markup tool. +% +% \textsf{graphviz} is a freely available package for doing automated +% graph layout from AT\&T Research, distributed under the Common +% Public License (CPL). +% \textsf{graphviz} +% includes the \textsf{dot} and \textsf{neato} programs, which read a textual +% description of a graph and produces a graphical rendering of it. +% Many different graphics formats, include PostScript, are supported. +% +% There are two main web pages for the \textsf{graphviz} project: +% +% \begin{itemize} +% +% \item \url{http://www.graphviz.org} +% +% \item \url{http://www.research.att.com/sw/tools/graphviz/} +% +% \end{itemize} +% +% \textsf{graphviz.sty} is provided as-is, with no warranty or claim to +% fitness for any purpose, use at your own risk, etc. +% \textsf{graphviz.sty} +% is distributed under the \LaTeX\ Project Public License. +% +% \section{Example} +% +% Put this in your document: +% +% \hspace*{2em}|\digraph[scale=0.5]{abc}{rankdir=LR; a->b->c;}| +% +% Run these commands (only the first run needs \texttt{-shell-escape}): +% +% \hspace*{2em}|latex -shell-escape main.tex| \\ +% \hspace*{2em}|latex main.tex| +% +% +% And here's what you get: +% +% \vspace{1ex} +% +% \hspace*{2em}\digraph[scale=0.5]{abc}{rankdir=LR; a->b->c;} +% +% \vspace{1ex} +% +% +% \newpage +% \section{Usage} +% +% \DescribeMacro{\digraph\oarg{i}\marg{n}\marg{g}} +% The |\digraph| (\textsf{dot}) and |\neatograph| (\textsf{neato}) +% commands take three arguments: +% +% \begin{enumerate} +% +% \item[\oarg{i}] parameters to the |\includegraphics| +% command that will include the PostScript file of the graph +% [this is optional]: eg, `\texttt{scale=0.5}' +% +% \item[\marg{n}] the name of the graph; a file \texttt{name.dot} +% is created, +% and a file \texttt{name.ps} is expected to be produced from +% \textsf{dot}: eg, `\texttt{MyGraph}' \\ +% \marg{n} has to be a valid file name and a valid identifier name. +% +% \item[\marg{g}] the graph, specified in the \textsf{dot/graphviz} +% language: +% \\ eg, `\texttt{rankdir=LR; a->b->c;}' +% +% \end{enumerate} +% +% \section{Options} +% +% +% \begin{macro}{singlefile} +% \changes{v0.6}{2005/12/03}{added singlefile option} +% \changes{v0.7}{2005/12/29}{now using gvpr instead of gawk to break out individual digraphs from master.graphviz} +% \changes{v0.94}{2013/08/15}{writing gvpr commands to separate script to be executed when master.graphviz is closed} +% +% \LaTeX\ has a small number of file handles (about 16 or so). So if +% you can't have too many digraphs in your tex file before you run out +% of file handles. The \texttt{singlefile} option is a work-around: +% it writes all of your digraphs to a single file +% (\texttt{tmpmaster.graphviz}), and then uses \textsf{gvpr} to split that +% file into individual dot files for processing by \textsf{dot}. +% +% The \textsc{gvpr} commands are all written to a second file +% (\texttt{tmpmaster.gvpr}), which +% is executed once the \texttt{tmpmaster.graphviz} file has been closed. +% +% \textsf{gvpr} does not seem to be packaged with the Windows version +% of \textsf{dot}. +% +% \begin{macrocode} +\newif\ifsinglefile +\DeclareOption{singlefile}{ + \singlefiletrue + \AtBeginDocument{% open a new file handle + \newwrite\masterdotfile% + \immediate\openout\masterdotfile=\@tmpdir tmpmaster.graphviz% + \newwrite\mastergvprfile% + \immediate\openout\mastergvprfile=\@tmpdir tmpmaster.gvpr} + \AtEndDocument{% close the file + % close the dot file and the gvpr file + \immediate\closeout\masterdotfile% + \immediate\closeout\mastergvprfile% + % execute the gvpr file + \immediate\write18{gvpr -f \@tmpdir tmpmaster.gvpr \@tmpdir tmpmaster.graphviz}% + }} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{psfrag} +% \changes{v0.8}{2005/12/30}{added psfrag option} +% +% The \texttt{psfrag} option uses the \textsf{psfrag} package to +% enable you to overlay \TeX\ fragments over included postscript +% files, such as those generated via the |\digraph| command. +% +% The \textsf{ladot} script from Brighten Godfrey uses Perl to extend +% the syntax of the graphviz language with \TeX\ fragments, and +% \textsf{psfrag} to super-impose those fragments. +% +% The \texttt{psfrag} option requires sed. +% \textsf{psfrag} seems to only work with \textsf{dvips}: ie, it is +% not compatible with \textsf{pdflatex} or \textsf{dvipdfm}. +% The PDF files produced by \LaTeX/\textsf{psfrag/ps2pdf} seem to view +% ok with \textsf{Acrobat}, but not with \textsf{gv}. +% Oddly, the PS files produced this way work in \textsf{gv}. +% +% Put this in your document: +% +% \hspace*{2em}|\psfrag{x2}[cc][cc]{$x^2$}| \\ +% \hspace*{2em}|\digraph{xy}{rankdir=LR; x2->y;}| +% +% And here's what you get: +% +% \vspace{1ex} +% +% \hspace*{2em}\psfrag{x2}[cc][cc]{$x^2$} \digraph[scale=0.5]{xy}{rankdir=LR; x2->y;} +% +% \vspace{1ex} +% +% +% +% \begin{macrocode} +\newif\ifpsfrag +\DeclareOption{psfrag}{ \psfragtrue } +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{ps} +% \changes{v0.92}{2013/08/15}{added ps option (previously default behaviour)} +% +% Tell Graphviz to generate Postscript files as output. +% +% \begin{macrocode} +\newcommand{\@outext}{ps} +\newcommand{\@outextspace}{ps } +\DeclareOption{ps}{ + \renewcommand{\@outext}{ps} + \renewcommand{\@outextspace}{ps }} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{pdf} +% \changes{v0.92}{2013/08/15}{added pdf option} +% +% Tell Graphviz to generate PDF files as output. +% +% \begin{macrocode} +\DeclareOption{pdf}{% + \renewcommand{\@outext}{pdf}% + \renewcommand{\@outextspace}{pdf }} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{tmpdir} +% \changes{v0.93}{2013/08/15}{added tmpdir option} +% +% Write all generated files in |./tmp/| +% +% \begin{macrocode} +\newcommand{\@tmpdir}{} +\DeclareOption{tmpdir}{% + \immediate\write18{mkdir ./tmp/}% + \renewcommand{\@tmpdir}{./tmp/}} +% \end{macrocode} +% \end{macro} +% +% +% +% \paragraph{Set the default options} +% +% \begin{macrocode} +\ExecuteOptions{ps} +\ProcessOptions\relax % LaTeX class guide says it is wise to relax +% \end{macrocode} +% +% +% +% \StopEventually{\PrintChanges\PrintIndex} +% +% \section{Implementation} +% +% \subsection{Required Packages} +% This package requires \textsf{graphicx} to include PostScript +% renderings of graphs. +% \begin{macrocode} +\RequirePackage{graphicx} +\ifpsfrag \RequirePackage{psfrag} \fi +% \end{macrocode} +% +% \subsection{Command Implementation} +% +% \begin{macro}{\digraph} +% \changes{v0.2}{2003/12/24}{minor adjustments} +% \changes{v0.4}{2004/05/14}{new comments} +% \changes{v0.5}{2004/05/19}{added automatic invocation of dot} +% \changes{v0.6}{2005/12/03}{added singlefile option} +% \changes{v0.7}{2005/12/29}{added backslash-hyphen line breaks by Ralf Hemmecke} +% \changes{v0.7}{2005/12/29}{now using gvpr instead of gawk to break out individual digraphs from master.graphviz} +% \changes{v0.7}{2005/12/29}{removed redundant invocation of dot from digraph; only inputdigraph needs to invoke dot} +% \changes{v0.9}{2006/01/08}{refactored for control-M by Ralf Hemmecke} +% \changes{v0.91}{2013/04/25}{a bit of cleanup and modernization} +% +% This is the command the user uses for \textsf{dot}. +% +% It is very important that this command is not defined with 3 +% parameters although it will be used with 3 parameters in the +% form |\digraph[OPTIONS]{FILENAME}{GRAPH}|. +% The reason is that the catcode for |^^M| +% must be changed \emph{before} \TeX\ +% reads the GRAPH argument. +% +% The order of the command (first |\inputdigraph| then |\@digraph|) +% may look a bit odd, but it simplifies the code. In order to include +% the digraph, \LaTeX\ has to be run at least two times anyway. In the +% first run the file \textsf{dot} will be generated and only +% the second run the digraph will be included. +% +% \begin{macrocode} +\newcommand{\digraph}[2][scale=1]{ + \inputdigraph[#1]{#2}{dot}% % Include the generated ps/pdf. + \@digraph{digraph}{#2}% % Generate the .dot file. +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\neatograph} +% \changes{v0.9}{2006/01/11}{added support for neato} +% +% This is the command the user uses for \textsf{neato}. The syntax is +% the same as for |\digraph|. +% +% \begin{macrocode} +\newcommand{\neatograph}[2][scale=1]{ + \inputdigraph[#1]{#2}{neato}% % Include the generated ps/pdf. + \@digraph{graph}{#2}% % Generate the .dot file. +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@digraph} +% Internal implementation. +% +% The macro |\@digraph| prepares the actual output of the digraph to a +% file (which is done by |\@@digraph|) by a special treatment of the +% newline character. +% Before entering |\@@digraph|, the input newline character (|^^M|) +% is made active, and redefined to expand to |^^J|. +% Note that |\@digraph| has a |\begingroup| that is closed in +% |\@@digraph|. +% +% The purpose of this is to preserve line breaks in the digraph. +% +% \begin{macrocode} +\begingroup + \catcode`\^^M=\active% + \gdef\@digraph{\begingroup\catcode`\^^M=\active\def^^M{^^J}\@@digraph}% +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@digraph} +% Internal implementation. +% +% The parameters of the macro |\@@digraph| are the TYPE, FILENAME and GRAPH +% of the initial |\digraph[OPTIONS]{FILENAME}{GRAPH}|. +% Note that if |\@@digraph| is entered the |^^M| character is active. +% Thus every newline character (|^^M|) in the following macro is +% hidden through a |%| sign at the end of line. +% \begin{macrocode} +\def\@@digraph#1#2#3{% + \ifsinglefile% write the graph to the master file + \expandafter\def\csname -\endcsname{\string\n}% + \immediate\write\masterdotfile{#1 #2 {#3}}% + \immediate\write\mastergvprfile{BEG_G { if ($.name == "#2") {writeG($G,"\@tmpdir#2.dot");} }}% + \else% open a new file handle + \newwrite\dotfile% + \immediate\openout\dotfile=\@tmpdir#2.dot% + \expandafter\def\csname -\endcsname{\string\n}% + \immediate\write\dotfile{#1 #2 {#3}}% + \immediate\closeout\dotfile% + \fi% +% Here comes the closing \endgroup that closes the group opened in \@digraph. + \endgroup}% +% Now ^^M is no longer active. +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\inputdigraph} +% \changes{v0.2}{2003/12/24}{minor adjustments} +% \changes{v0.8}{2005/12/30}{added psfrag support} +% +% This is usually only called by |\digraph|, +% but may be called by the user. +% +% The purpose is to include the ps/pdf rendering of the graph if +% it exists, or to give instructions on how to generate it. +% +% \begin{macrocode} +\newcommand{\inputdigraph}[3][scale=1]{ + % execute dot or neato (nb: requires latex -shell-escape) + \immediate\write18{#3 -T\@outextspace -o \@tmpdir#2.\@outextspace \@tmpdir#2.dot} + \IfFileExists{\@tmpdir#2.\@outext}{ % the postscript/pdf exists: include it + \ifpsfrag + % per the ladot 2.2 source code, psfrag has a problem with + % graphviz 2.2, and some sed hackery is necessary to work around + \write18{sed -ibackup -e "s/xshow/pop show/g" \@tmpdir#2.ps} + \fi + \includegraphics[#1]{\@tmpdir#2.\@outext} + } + % else: the postscript/pdf doesn't exist: tell the user how to create it + { + \fbox{ \begin{tabular}{l} + The file \texttt{#2.\@outext} hasn't been created from + \texttt{\@tmpdir#2.dot} yet. \\ + Run `\texttt{dot -T\@outextspace -o \@tmpdir#2.\@outextspace \@tmpdir#2.dot}' + to create it. \\ + Or invoke \LaTeX\ with the \texttt{-shell-escape} option + to have this done automatically. \\ + \end{tabular}} + } +} +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Process} +% +% |\digraph| writes out a \textsf{dot} file, and then invokes +% \textsf{dot} on it. +% +% Note: |\digraph| can only invoke \textsf{dot} if the \LaTeX\ was +% invoked with the \texttt{-shell-escape} option, to enable execution of +% external programs. If you do not want to allow \LaTeX\ to execute +% external programs, then you will have to invoke \textsf{dot} yourself. +% \textsf{graphviz} will also need to execute \textsf{gvpr} if the +% \texttt{singlefile} option has been selected, and \textsf{sed} if +% the \texttt{psfrag} option has been selected. +% +% Here's a picture of the process (drawn with \textsf{dot}, +% naturally). The picture shows the process using dvips, but pdflatex +% is now also supported with the pdf option. +% +% \begin{center} +% +% \digraph[height=\textheight-2in]{process}{ +% /* PROGRAMS */ +% latex1 [label="latex -shell-escape x.tex", shape=hexagon, fontname=Courier]; +% latex2 [label="latex x.tex", shape=hexagon, fontname=Courier]; +% dvips [label="dvips -o x.ps x.dvi", shape=hexagon, fontname=Courier]; +% /* FILES */ +% xTex [label="x.tex", fontname=Helvetica, shape=ellipse]; +% xDvi [label="x.dvi", fontname=Helvetica, shape=ellipse]; +% xPS [label="x.ps", fontname=Helvetica, shape=ellipse]; +% subgraph cluster0 { +% label="graphviz.sty magic"; +% dot [label="dot -Tps -o a.ps a.dot", shape=hexagon, fontname=Courier]; +% gvpr [label="gvpr master.graphviz", shape=hexagon, fontname=Courier]; +% aPS [label="a.ps", fontname=Helvetica, shape=ellipse]; +% sed [label="sed s/xshow/pop show/g a.ps", shape=hexagon, fontname=Courier]; +% aDot [label="a.dot", fontname=Helvetica, shape=ellipse]; +% master [label="master.graphviz", fontname=Helvetica, shape=ellipse]; +% }; +% /* COMMON EDGES */ +% xTex -> latex1; +% xTex -> latex2; +% latex2 -> xDvi; +% xDvi -> dvips; +% dvips -> xPS; +% latex1 -> master [style=dotted, label=singlefile]; +% latex1 -> aDot [style=dotted, label="multiple files"]; +% master -> gvpr; +% gvpr -> aDot; +% aDot -> dot; +% dot -> aPS; +% aPS -> sed; +% sed -> aPS; +% aPS -> dvips; +% aPS -> latex2; +% } +% \end{center} +% +% \newpage +% +% +% +% \Finale +\endinput diff --git a/thesis2/graphviz.ins b/thesis2/graphviz.ins new file mode 100644 index 0000000..8156c81 --- /dev/null +++ b/thesis2/graphviz.ins @@ -0,0 +1,49 @@ +%% +%% Copyright (C) 2003-13 by Derek Rayside +%% +%% This file may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License, either version 1.3c of this license +%% or (at your option) any later version. The latest version of this +%% license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% + +\input docstrip.tex +\keepsilent + +\usedir{tex/latex/graphviz} + +\preamble + +This is a generated file. + +Copyright (C) 2003-13 by Derek Rayside + +This file may be distributed and/or modified under the conditions of +the LaTeX Project Public License, either version 1.3c of this license +or (at your option) any later version. The latest version of this +license is in: + + http://www.latex-project.org/lppl.txt + +\endpreamble + +\generate{\file{graphviz.sty}{\from{graphviz.dtx}{package}}} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* graphviz.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file graphviz.dtx *} +\Msg{* through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/thesis2/graphviz.sty b/thesis2/graphviz.sty new file mode 100644 index 0000000..7bc7d28 --- /dev/null +++ b/thesis2/graphviz.sty @@ -0,0 +1,106 @@ +%% +%% This is file `graphviz.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% graphviz.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2003-13 by Derek Rayside +%% +%% This file may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License, either version 1.3c of this license +%% or (at your option) any later version. The latest version of this +%% license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{graphviz} + [2013/08/15 v0.94 .dtx graphviz file] +\newif\ifsinglefile +\DeclareOption{singlefile}{ + \singlefiletrue + \AtBeginDocument{% open a new file handle + \newwrite\masterdotfile% + \immediate\openout\masterdotfile=\@tmpdir tmpmaster.graphviz% + \newwrite\mastergvprfile% + \immediate\openout\mastergvprfile=\@tmpdir tmpmaster.gvpr} + \AtEndDocument{% close the file + % close the dot file and the gvpr file + \immediate\closeout\masterdotfile% + \immediate\closeout\mastergvprfile% + % execute the gvpr file + \immediate\write18{gvpr -f \@tmpdir tmpmaster.gvpr \@tmpdir tmpmaster.graphviz}% + }} +\newif\ifpsfrag +\DeclareOption{psfrag}{ \psfragtrue } +\newcommand{\@outext}{ps} +\newcommand{\@outextspace}{ps } +\DeclareOption{ps}{ + \renewcommand{\@outext}{ps} + \renewcommand{\@outextspace}{ps }} +\DeclareOption{pdf}{% + \renewcommand{\@outext}{pdf}% + \renewcommand{\@outextspace}{pdf }} +\newcommand{\@tmpdir}{} +\DeclareOption{tmpdir}{% + \immediate\write18{mkdir ./tmp/}% + \renewcommand{\@tmpdir}{./tmp/}} +\ExecuteOptions{ps} +\ProcessOptions\relax % LaTeX class guide says it is wise to relax +\RequirePackage{graphicx} +\ifpsfrag \RequirePackage{psfrag} \fi +\newcommand{\digraph}[2][scale=1]{ + \inputdigraph[#1]{#2}{dot}% % Include the generated ps/pdf. + \@digraph{digraph}{#2}% % Generate the .dot file. +} +\newcommand{\neatograph}[2][scale=1]{ + \inputdigraph[#1]{#2}{neato}% % Include the generated ps/pdf. + \@digraph{graph}{#2}% % Generate the .dot file. +} +\begingroup + \catcode`\^^M=\active% + \gdef\@digraph{\begingroup\catcode`\^^M=\active\def^^M{^^J}\@@digraph}% +\endgroup +\def\@@digraph#1#2#3{% + \ifsinglefile% write the graph to the master file + \expandafter\def\csname -\endcsname{\string\n}% + \immediate\write\masterdotfile{#1 #2 {#3}}% + \immediate\write\mastergvprfile{BEG_G { if ($.name == "#2") {writeG($G,"\@tmpdir#2.dot");} }}% + \else% open a new file handle + \newwrite\dotfile% + \immediate\openout\dotfile=\@tmpdir#2.dot% + \expandafter\def\csname -\endcsname{\string\n}% + \immediate\write\dotfile{#1 #2 {#3}}% + \immediate\closeout\dotfile% + \fi% + \endgroup}% +\newcommand{\inputdigraph}[3][scale=1]{ + % execute dot or neato (nb: requires latex -shell-escape) + \immediate\write18{#3 -T\@outextspace -o \@tmpdir#2.\@outextspace \@tmpdir#2.dot} + \IfFileExists{\@tmpdir#2.\@outext}{ % the postscript/pdf exists: include it + \ifpsfrag + % per the ladot 2.2 source code, psfrag has a problem with + % graphviz 2.2, and some sed hackery is necessary to work around + \write18{sed -ibackup -e "s/xshow/pop show/g" \@tmpdir#2.ps} + \fi + \includegraphics[#1]{\@tmpdir#2.\@outext} + } + % else: the postscript/pdf doesn't exist: tell the user how to create it + { + \fbox{ \begin{tabular}{l} + The file \texttt{#2.\@outext} hasn't been created from + \texttt{\@tmpdir#2.dot} yet. \\ + Run `\texttt{dot -T\@outextspace -o \@tmpdir#2.\@outextspace \@tmpdir#2.dot}' + to create it. \\ + Or invoke \LaTeX\ with the \texttt{-shell-escape} option + to have this done automatically. \\ + \end{tabular}} + } +} +\endinput +%% +%% End of file `graphviz.sty'. diff --git a/thesis2/test/Makefile b/thesis2/test/Makefile new file mode 100644 index 0000000..5253fff --- /dev/null +++ b/thesis2/test/Makefile @@ -0,0 +1,40 @@ +.PHONY: all clean clobber + +TPDF = $(shell find . -maxdepth 1 -type f -name 'pdf*.tex' | sort) +TPS = $(shell find . -maxdepth 1 -type f -name 'ps*.tex' | sort) +PS = $(TPS:.tex=.ps) +PDF = $(TPDF:.tex=.pdf) + + +all: $(PS) $(PDF) + +%.pdf: %.tex + pdflatex -shell-escape $< + pdflatex -shell-escape $< + +%.dvi: %.tex + latex -shell-escape $< + latex -shell-escape $< + +%.ps: %.dvi + dvips $< + +clean: + rm -rf ./tmp + rm -f master.gvpr + rm -f master.graphviz + rm -f *~ + rm -f *.dot + rm -f *.ps + rm -f *.pdf + rm -f *.aux + rm -f *.glo + rm -f *.gls + rm -f *.idx + rm -f *.ilg + rm -f *.log + rm -f *.dvi + +clobber: clean + rm -f $(PS) + rm -f $(PDF) diff --git a/thesis2/test/body.tex b/thesis2/test/body.tex new file mode 100644 index 0000000..c426f98 --- /dev/null +++ b/thesis2/test/body.tex @@ -0,0 +1,9 @@ +\begin{document} + +\section{Dot} +\digraph[scale=0.5]{abc}{rankdir=LR; a->b->c; b->d;} + +\section{Neato} +\neatograph[scale=0.5]{xyz}{rankdir=LR; w--y; x--y--z;} + +\end{document} diff --git a/thesis2/test/pdf-singlefile-tmpdir.tex b/thesis2/test/pdf-singlefile-tmpdir.tex new file mode 100644 index 0000000..b551f95 --- /dev/null +++ b/thesis2/test/pdf-singlefile-tmpdir.tex @@ -0,0 +1,3 @@ +\documentclass{article} +\usepackage[pdf,singlefile,tmpdir]{graphviz} +\input{body} diff --git a/thesis2/test/pdf-singlefile.tex b/thesis2/test/pdf-singlefile.tex new file mode 100644 index 0000000..dc8db4a --- /dev/null +++ b/thesis2/test/pdf-singlefile.tex @@ -0,0 +1,3 @@ +\documentclass{article} +\usepackage[pdf,singlefile]{graphviz} +\input{body} diff --git a/thesis2/test/pdf-tmpdir.tex b/thesis2/test/pdf-tmpdir.tex new file mode 100644 index 0000000..981805d --- /dev/null +++ b/thesis2/test/pdf-tmpdir.tex @@ -0,0 +1,3 @@ +\documentclass{article} +\usepackage[pdf,tmpdir]{graphviz} +\input{body} diff --git a/thesis2/test/pdf.tex b/thesis2/test/pdf.tex new file mode 100644 index 0000000..127ff89 --- /dev/null +++ b/thesis2/test/pdf.tex @@ -0,0 +1,3 @@ +\documentclass{article} +\usepackage[pdf]{graphviz} +\input{body} diff --git a/thesis2/test/ps.tex b/thesis2/test/ps.tex new file mode 100644 index 0000000..d609767 --- /dev/null +++ b/thesis2/test/ps.tex @@ -0,0 +1,3 @@ +\documentclass{article} +\usepackage[ps]{graphviz} +\input{body} diff --git a/thesis2/version/mart_thesis_0.3.tar b/thesis2/version/mart_thesis_0.3.tar new file mode 100644 index 0000000000000000000000000000000000000000..b59042f3fa511c096f72508ccefd750fcd15d28b GIT binary patch literal 40960 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 literal 0 HcmV?d00001 -- 2.20.1