[Refdb-cvs] CVS: tutorial refdbtutorial.sgml,1.1.1.1,1.2
Status: Beta
Brought to you by:
mhoenicka
|
From: Markus H. <mho...@us...> - 2004-02-10 23:55:12
|
Update of /cvsroot/refdb/tutorial In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29637 Modified Files: refdbtutorial.sgml Log Message: updated for 0.9.4 Index: refdbtutorial.sgml =================================================================== RCS file: /cvsroot/refdb/tutorial/refdbtutorial.sgml,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -U2 -r1.1.1.1 -r1.2 --- refdbtutorial.sgml 9 Feb 2004 20:52:24 -0000 1.1.1.1 +++ refdbtutorial.sgml 10 Feb 2004 23:51:31 -0000 1.2 @@ -16,4 +16,8 @@ <revhistory> <revision> + <revnumber>1.1</revnumber> + <date>2004-02-08</date> + </revision> + <revision> <revnumber>1.0</revnumber> <date>2002-11-22</date> @@ -49,12 +53,14 @@ defaultdb refs pager less +toencoding ISO-8859-1 +fromencoding ISO-8859-1 </programlisting> <para>The line starting with the hash sign (#) is a <emphasis>comment</emphasis>. You can add more comment lines if you want to, or leave out the comment line in the example if you remember what that file is good for anyway.</para> <para>If you (or your administrator) don't feel comfortable with storing your password in a plain-text file, you can use an asterisk "*" instead. This will cause the &appname; clients to ask for the password interactively at startup.</para> - <para>Now what does the configuration file <filename moreinfo="none">.&appname;ibrc</filename> look like? Incidentally it is the same, because we don't use any advanced features of these programs yet. You can simply create a copy and name it <filename moreinfo="none">.&appname;ibrc</filename>.</para> + <para>Now what does the configuration file <filename moreinfo="none">.&appname;ibrc</filename> look like? It is the same with the exception of the last line. You can simply create a copy and name it <filename moreinfo="none">.&appname;ibrc</filename>, remove the last line, and you're done.</para> </sect1> </chapter> <chapter> - <title>Managing references</title> + <title>Managing references and notes</title> <para>Now everything is ready to do some real work. We'll go ahead and learn how to use the reference management client.</para> <sect1> @@ -142,11 +148,11 @@ <sect1 id="sect-adding-refs"> <title>Adding references</title> - <para>If you're new to &appname; and don't have a database yet, you'll want to start by adding a couple of references. This chapter first teaches you how to add references in the main input format RIS. The following sections cover the import of data from various data sources like PubMed, BibTeX, or Z39.50 servers.</para> + <para>If you're new to &appname; and don't have a database yet, you'll want to start by adding a couple of references. This chapter first teaches you how to add references in the main input formats RIS and risx. The subsequent sections cover the import of data from various data sources like PubMed, BibTeX, or Z39.50 servers.</para> <tip> <para>If you're really new to &appname; but have access to an existing database, e.g. the one your department built, you might want to get acquainted with &appname; by <link linkend="sect-finding-refs">retrieving existing references</link>. Retrieving references does not alter the database, so this is safe to play around. Once you feel comfortable, return to this section.</para> </tip> <sect2> - <title>Adding RIS datasets</title> - <para>The RIS format is a plain-text tagged file format used by most Windows- and Mac-based reference management tools. This is currently the only reference data format that &appname; understands natively. All other data formats supported by &appname; must be converted to RIS using the conversion tools described in the following sections.</para> + <title>How to create RIS datasets</title> + <para>The RIS format is a plain-text tagged file format used by most Windows- and Mac-based reference management tools. A variety of other data formats supported by &appname; can be converted to RIS using the conversion tools described in the following sections.</para> <sect3> <title>What a RIS dataset looks like</title> @@ -586,138 +592,88 @@ </variablelist> </sect3> - <sect3 id="sect-global-personal-fields"> - <title>Global and personal fields</title> - <para>&appname; differs from other reference management tools because a main goal of its design is to encourage people to share their references. However, you may have figured from the tag list above that some of these entries only make sense if they can be maintained by each user individually. This is precisely the approach used by &appname;: The "hard" bibliographic data are global and identical for each user. The "soft" personal data, which are the only ones likely to change after the reference was added anyway, are maintained for each user individually. These personal fields are:</para> - <itemizedlist> - <listitem> - <para>The reprint status (RP)</para> - </listitem> - <listitem> - <para>The availability field (AV)</para> - </listitem> - <listitem> - <para>The notes field (N1)</para> - </listitem> - </itemizedlist> - <para>Even if you use one of the import filters described below or if you use RIS files exported from other bibliographic software, you should take the time to fill these fields with useful values. If you don't specify values, the AV and N1 field will be blank (this is ok), and the RP field will have the default value "NOT IN FILE".</para> - </sect3> <sect3> - <title>Adding vs. updating references</title> - <para>In most cases you have a new set of references and want to add them to your database. This is no big deal if the data comply with the RIS specification outlined above. Assuming your references are stored in a file <filename moreinfo="none">newrefs.ris</filename> in the present working directory, all you need to do is:</para> - <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref newrefs.ris</userinput></screen> - <para>To simply add the references in the example RIS file, use this command:</para> - <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref /usr/local/share/&appname;/examples/testrefs.ris</userinput></screen> - <para>&appname;c will try to add the references stored in that file to your default database. The diagnostic messages will be displayed in your pager, so if you send a dozen or so references it might take a few seconds until the results are displayed. You'll see a message for each reference found in the input file: Which ID was assigned, which citation key was used (or generated if you didn't specify one), and whether the operation was successful. Adding references usually fails only for two reasons:</para> - <itemizedlist> - <listitem> - <para>The input data didn't contain useful RIS datasets.</para> - </listitem> - <listitem> - <para>A citation key was specified in the reference but the same citation key already exists in the database. &appname; will refuse to accept the reference because citation keys <emphasis>must</emphasis> be unique. You can fix this by changing or deleting the offending citation key in the input file.</para> - </listitem> - </itemizedlist> - <para>Once a reference is added to the database, you might still feel the urge to change it. Be it that you would like to add further keywords or that your personal information, like the reprint status, have changed since. The most straightforward way to change a reference is to retrieve it in RIS format, save it to a file, edit it, and send the updated copy back to where it came from. The following sequence of commands achieves this:</para> - <note> - <para>In this example we'll assume that you already know the ID of the reference that you want to change. You'll learn <link linkend="sect-finding-refs">later</link> how to find a reference by all sorts of criteria like authors, keywords and the like. This section also has additional information on the <command moreinfo="none">getref</command> command used here.</para> - </note> - <screen format="linespecific"> -<prompt moreinfo="none">&appname;c: </prompt><userinput moreinfo="none">getref -t ris -o editme.ris :ID:=7</userinput> -2595 byte written to /usr/home/markus/refdb/editme.ris -<prompt moreinfo="none">&appname;c: </prompt> -</screen> - <para>Now you can use your favourite text editor to change the file <filename moreinfo="none">editme.ris</filename> as you see fit. For this exercise we'll just change the reprint status (the RP field) from "NOT IN FILE" to "IN FILE". When you're done, save the file and go back to &appname;c:</para> - <screen format="linespecific"> -<prompt moreinfo="none">&appname;c: </prompt><userinput moreinfo="none">updateref -P editme.ris</userinput> -Updating set 0 successful -1 dataset(s) updated, 0 added, 0 failed -1 dataset(s) sent. -</screen> - <para>Now what was that <option>-P</option> switch good for? This switch tells &appname; that it should only update your personal information of this reference, i.e. the RP, AV, and N1 fields. This is a lot faster than updating the whole reference. It is also more secure as you might have changed the file somewhere else accidentally without noticing. On the other hand, if you e.g. correct a typo you noticed in the title (TI) field, you <emphasis>must not</emphasis> use the <option>-P</option> switch.</para> - </sect3> - </sect2> - <sect2> - <title>Creating a RIS dataset from scratch</title> - <para>As noted previously, you can use any text editor that creates Unix-style line endings (linefeed) to create and edit RIS files. &appname; ships a ris-mode for Emacs which makes the task a little more pleasant. Ask your administrator whether this mode is available on your system.</para> - <para>Creating a dataset is basically monkey business. The only intelligence required is to use the correct tags for your chunks of bibliographic information. Use the example RIS file as guidelines for the most common reference types journal article, book chapter, and book. We'll look at a few issues related to these references first.</para> - <para>The first issue is certainly the type of the reference. There are pretty clear cases if you look at the list, but there's some bordercases too which are not covered by the predefined types. You should keep in mind that &appname; does not restrict the fields available for a particular reference type. You can fill any available field for any reference type. The only restriction is that the bibliography styles for most reference types use only a subset of the available fields. E.g. a bibliography entry of a journal article will not show a series editor even if you filled in the A3 field, whereas the bibliography entry of a book chapter might show the series editor if the book the chapter is published in is a part of a series.</para> - <para>The general rule is to use the closest matching type, to be consistent in this decision (all similar bordercases should use the same type), and to use the GEN type if nothing else helps. Most bibliography styles display all available fields for the GEN type.</para> - <para>To people new to bibliographic software, the various levels of titles and authors is often confusing. RIS offers three levels of authors:</para> - <variablelist> - <varlistentry> - <term>AU (synonym: A1)</term> - <listitem> - <para>The author of a publication. This is the person (or the persons) responsible for the smallest unit of the publication you're looking at.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>ED (synonym: A2)</term> - <listitem> - <para>The editor of a collection of publications.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>A3</term> - <listitem> - <para>The editor of a series of collections of publications.</para> - </listitem> - </varlistentry> - </variablelist> - <para>Lets consider a few examples. If your reference contains a journal article, published in some scientific journal, the AU fields contain the names of those who wrote the article. The same holds true for the authors of a chapter published in a book like "Methods in Enzymology". The chapter authors would be in the AU fields, the volume editors in the ED field. The editors of the whole "Methods in Enzymology" series of books would be entered in A3 fields. However, if your reference points to one particular volume of "Methods in Enzymology" as a whole, you'd rather put the volume editors in the AU fields. The same logic holds true for the title fields:</para> - <variablelist> - <varlistentry> - <term>TI (synonym: T1)</term> - <listitem> - <para>The title of the smallest unit of publication you're looking at.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>A2</term> - <listitem> - <para>The title of the collection of publications</para> - </listitem> - </varlistentry> + <title>Creating a RIS dataset from scratch</title> + <para>As noted previously, you can use any text editor that creates Unix-style line endings (linefeed) to create and edit RIS files. &appname; ships a ris-mode for Emacs which makes the task a little more pleasant. Ask your administrator whether this mode is available on your system.</para> + <para>Creating a dataset is basically monkey business. The only intelligence required is to use the correct tags for your chunks of bibliographic information. Use the example RIS file as guidelines for the most common reference types journal article, book chapter, and book. We'll look at a few issues related to these references first.</para> + <para>The first issue is certainly the type of the reference. There are pretty clear cases if you look at the list, but there's some bordercases too which are not covered by the predefined types. You should keep in mind that &appname; does not restrict the fields available for a particular reference type. You can fill any available field for any reference type. The only restriction is that the bibliography styles for most reference types use only a subset of the available fields. E.g. a bibliography entry of a journal article will not show a series editor even if you filled in the A3 field, whereas the bibliography entry of a book chapter might show the series editor if the book the chapter is published in is a part of a series.</para> + <para>The general rule is to use the closest matching type, to be consistent in this decision (all similar bordercases should use the same type), and to use the GEN type if nothing else helps. Most bibliography styles display all available fields for the GEN type.</para> + <para>To people new to bibliographic software, the various levels of titles and authors is often confusing. RIS offers three levels of authors:</para> + <variablelist> + <varlistentry> + <term>AU (synonym: A1)</term> + <listitem> + <para>The author of a publication. This is the person (or the persons) responsible for the smallest unit of the publication you're looking at.</para> + </listitem> + </varlistentry> + <varlistentry> + <term>ED (synonym: A2)</term> + <listitem> + <para>The editor of a collection of publications.</para> + </listitem> + </varlistentry> <varlistentry> - <term>A3</term> - <listitem> - <para>The title of the series of collections of publications</para> - </listitem> - </varlistentry> - </variablelist> - <para>Using our previous example, an article published in "Methods in Enzymology" might have a TI field "An apparatus to turn urine into gold". The T2 field would be the title of the volume, e.g. "Alchemy and related techniques", whereas the T3 field would contain "Methods in Enzymology". However, if your reference points to the "Alchemy and related techniques" volume as a whole, this title would go into the T1 field.</para> - </sect2> - <sect2 id="sect-retrieve-pubmed"> - <title>Retrieving datasets from PubMed</title> - <para>The primary source of reference data in the biomedical field is the PubMed database maintained by the <ulink url="http://www.ncbi.nlm.nih.gov">National Center for Biotechnology Information</ulink>. This section shows the simplest and most common way to retrieve bibliographic information about interesting articles from this database using a web browser (other methods use web service clients or email subscription services, but this is beyond the scope of this tutorial).</para> - <para>After visiting the site with your favourite web browser, select "PubMed" from the drop-down box called "Search" and type a query in the provided field. Something like "Doe J 2002" to find articles published by J. Doe in 2002. After hitting "Enter" you'll receive a list of publications matching your query. Select the ones you're interested in by clicking the check box right next to the publication (convenience beating logic, you can also check <emphasis>none</emphasis> of the boxes in order to retrieve <emphasis>all</emphasis> publications). Select "XML" from the drop-down box next to the <guibutton moreinfo="none">Display</guibutton> button and hit the latter. You'll receive the list of the publications in the Pubmed XML format. Now click the <guibutton moreinfo="none">Save</guibutton> button on that page and save the information to a plain-text file, e.g. <filename moreinfo="none">pm001.xml</filename>. You could then return to the search, run a few more queries, and save your results in additional files according to this pattern.</para> - <para>We'll use the Perl script <command moreinfo="none">med2ris.pl</command> to turn our XML data into RIS data. This tool either reads Pubmed data from standard input or from files specified as arguments. The result will be sent to standard output, so you can either view it with a pager or write it to a file.</para> - <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">med2ris.pl < pm001.xml | less</userinput></screen> - <para>This command converts the data in the file <filename moreinfo="none">pm001.xml</filename> and displays the result in a pager.</para> - <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">med2ris.pl pm*.xml > pm.ris</userinput></screen> - <para>This command converts all files that match the pattern <filename moreinfo="none">pm*.xml</filename>, like <filename moreinfo="none">pm001.xml</filename> or <filename moreinfo="none">pmnew.xml</filename>, and writes the resulting RIS datasets to <filename moreinfo="none">pm.ris</filename>.</para> - <para>Now you should add your personal information to each dataset, as outlined <link linkend="sect-global-personal-fields">above</link>. Then you could go ahead and add the references to your default database with &appname;c:</para> - <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt>addref pm.ris</screen> - </sect2> - <sect2> - <title>Importing BibTeX datasets</title> - <para>If you have a BibTeX database that you want to import into &appname;, you'll have to convert these data to RIS first. This is again best done by using one of the converters shipped with &appname;. The tool <command moreinfo="none">bib2ris</command> will by default convert all standard BibTeX fields to the RIS equivalents. If you used non-standard fields in your BibTeX database, <command moreinfo="none">bib2ris</command> can be configured to import these too, but this requires additional entries in the <filename moreinfo="none">~/.bib2risrc</filename> configuration file. The manual has all the details, but for the purposes of this tutorial we'll assume that you only use an "ABSTRACT" field as the only additional non-standard field.</para> - <para>Just like &appname;c, bib2ris reads configuration files at startup which you can modify to permanently set some defaults. The syntax of the configuration file is the same as outlined <link linkend="sect-config-files">above</link>, but the only line we have to enter at this time is the following:</para> - <programlisting format="linespecific"> + <term>A3</term> + <listitem> + <para>The editor of a series of collections of publications.</para> + </listitem> + </varlistentry> + </variablelist> + <para>Lets consider a few examples. If your reference contains a journal article, published in some scientific journal, the AU fields contain the names of those who wrote the article. The same holds true for the authors of a chapter published in a book like "Methods in Enzymology". The chapter authors would be in the AU fields, the volume editors in the ED field. The editors of the whole "Methods in Enzymology" series of books would be entered in A3 fields. However, if your reference points to one particular volume of "Methods in Enzymology" as a whole, you'd rather put the volume editors in the AU fields. The same logic holds true for the title fields:</para> + <variablelist> + <varlistentry> + <term>TI (synonym: T1)</term> + <listitem> + <para>The title of the smallest unit of publication you're looking at.</para> + </listitem> + </varlistentry> + <varlistentry> + <term>A2</term> + <listitem> + <para>The title of the collection of publications</para> + </listitem> + </varlistentry> + <varlistentry> + <term>A3</term> + <listitem> + <para>The title of the series of collections of publications</para> + </listitem> + </varlistentry> + </variablelist> + <para>Using our previous example, an article published in "Methods in Enzymology" might have a TI field "An apparatus to turn urine into gold". The T2 field would be the title of the volume, e.g. "Alchemy and related techniques", whereas the T3 field would contain "Methods in Enzymology". However, if your reference points to the "Alchemy and related techniques" volume as a whole, this title would go into the T1 field.</para> + </sect3> + <sect3 id="sect-retrieve-pubmed"> + <title>Retrieving datasets from PubMed</title> + <para>The primary source of reference data in the biomedical field is the PubMed database maintained by the <ulink url="http://www.ncbi.nlm.nih.gov">National Center for Biotechnology Information</ulink>. This section shows the simplest and most common way to retrieve bibliographic information about interesting articles from this database using a web browser (other methods use web service clients or email subscription services, but this is beyond the scope of this tutorial).</para> + <para>After visiting the site with your favourite web browser, select "PubMed" from the drop-down box called "Search" and type a query in the provided field. Something like "Doe J 2002" to find articles published by J. Doe in 2002. After hitting "Enter" you'll receive a list of publications matching your query. Select the ones you're interested in by clicking the check box right next to the publication (convenience beating logic, you can also check <emphasis>none</emphasis> of the boxes in order to retrieve <emphasis>all</emphasis> publications). Select "XML" from the drop-down box next to the <guibutton moreinfo="none">Display</guibutton> button and hit the latter. You'll receive the list of the publications in the Pubmed XML format. Now click the <guibutton moreinfo="none">Save</guibutton> button on that page and save the information to a plain-text file, e.g. <filename moreinfo="none">pm001.xml</filename>. You could then return to the search, run a few more queries, and save your results in additional files according to this pattern.</para> + <para>We'll use the Perl script <command moreinfo="none">med2ris.pl</command> to turn our XML data into RIS data. This tool either reads Pubmed data from standard input or from files specified as arguments. The result will be sent to standard output, so you can either view it with a pager or write it to a file.</para> + <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">med2ris.pl < pm001.xml | less</userinput></screen> + <para>This command converts the data in the file <filename moreinfo="none">pm001.xml</filename> and displays the result in a pager.</para> + <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">med2ris.pl pm*.xml > pm.ris</userinput></screen> + <para>This command converts all files that match the pattern <filename moreinfo="none">pm*.xml</filename>, like <filename moreinfo="none">pm001.xml</filename> or <filename moreinfo="none">pmnew.xml</filename>, and writes the resulting RIS datasets to <filename moreinfo="none">pm.ris</filename>.</para> + <para>Now you should add your personal information to each dataset, as outlined <link linkend="sect-global-personal-fields">above</link>. Then you could go ahead and add the references to your default database with &appname;c:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt>addref pm.ris</screen> + </sect3> + <sect3> + <title>Importing BibTeX datasets</title> + <para>If you have a BibTeX database that you want to import into &appname;, you'll have to convert these data to RIS first. This is again best done by using one of the converters shipped with &appname;. The tool <command moreinfo="none">bib2ris</command> will by default convert all standard BibTeX fields to the RIS equivalents. If you used non-standard fields in your BibTeX database, <command moreinfo="none">bib2ris</command> can be configured to import these too, but this requires additional entries in the <filename moreinfo="none">~/.bib2risrc</filename> configuration file. The manual has all the details, but for the purposes of this tutorial we'll assume that you only use an "ABSTRACT" field as the only additional non-standard field.</para> + <para>Just like &appname;c, bib2ris reads configuration files at startup which you can modify to permanently set some defaults. The syntax of the configuration file is the same as outlined <link linkend="sect-config-files">above</link>, but the only line we have to enter at this time is the following:</para> + <programlisting format="linespecific"> nsf_abstract N2 -</programlisting> - <para>This will tell bib2ris to import your non-standard abstract field (this is case-insensitive, so your BibTeX file might use ABSTRACT or Abstract as well) into the N2 RIS field. Use the following command to see the results:</para> - <screen><prompt>~$ </prompt>bib2ris < myrefs.bib | less</screen> - <para>This command will convert the contents of <filename>myrefs.bib</filename> in the current directory and display the result in a pager.</para> - <screen><prompt>~$ </prompt>bib2ris *.bib > myrefs.ris</screen> - <para>This command reads the data from all <filename>*.bib</filename> files in the current directory and redirects the output into the file <filename>myrefs.ris</filename>.</para> - <para>Now there is a little issue with the data generated by bib2ris: they still contain all TeX markup that you may have used in your input data. If you want to use &appname; only to maintain references for LaTeX files, this is probably ok, but if you want to use the data for SGML and XML documents too, it is necessary to strip the TeX markup before adding the references to the database. To this end, run the RIS file through the Perl script <command moreinfo="none">tex2mail</command> shipped with &appname;.</para> - <screen><prompt>~$ </prompt>tex2mail -noindent -ragged -linelength 65535 -ris < myrefs.ris > myrefs-notex.ris</screen> - <para>As described in the <link linkend="sect-retrieve-pubmed">previous section</link>, you should now add your personal information and then use &appname;c to add the datasets to your database.</para> - </sect2> - <sect2> - <title>Retrieving datasets from a Z39.50 server</title> - <para>Many libraries allow remote access to their electronic catalogs via the Z39.50 protocol. With a suitable client you can search the catalogs and retrieve the bibliographic information of interesting references to your local computer. For this tutorial we'll use the free client provided in the <ulink url="http://www.indexdata.dk/yaz/">YAZ toolkit</ulink>, although you could use any other client as well. One of the largest libraries accessible via the Z39.50 protocol is the <ulink url="http://www.loc.gov">Library of Congress</ulink>. We'll try to find computer books written by some Mr. Knuth in this library.</para> - <para>The following command connects to the library using the host name "z3950.loc.gov", the port 7090, and the database name "Voyager". All this information is usually provided either online or in a printed pamphlet about electronic catalog access published by libraries offering Z39.50 services:</para> - <screen format="linespecific"> -<prompt>~$ </prompt><userinput>yaz-client z3950.loc.gov:7090/Voyager</userinput> + </programlisting> + <para>This will tell bib2ris to import your non-standard abstract field (this is case-insensitive, so your BibTeX file might use ABSTRACT or Abstract as well) into the N2 RIS field. Use the following command to see the results:</para> + <screen><prompt>~$ </prompt>bib2ris < myrefs.bib | less</screen> + <para>This command will convert the contents of <filename>myrefs.bib</filename> in the current directory and display the result in a pager.</para> + <screen><prompt>~$ </prompt>bib2ris *.bib > myrefs.ris</screen> + <para>This command reads the data from all <filename>*.bib</filename> files in the current directory and redirects the output into the file <filename>myrefs.ris</filename>.</para> + <para>Now there is a little issue with the data generated by bib2ris: they still contain all TeX markup that you may have used in your input data. If you want to use &appname; only to maintain references for LaTeX files, this is probably ok, but if you want to use the data for SGML and XML documents too, it is necessary to strip the TeX markup before adding the references to the database. To this end, run the RIS file through the Perl script <command moreinfo="none">tex2mail</command> shipped with &appname;.</para> + <screen><prompt>~$ </prompt>tex2mail -noindent -ragged -linelength 65535 -ris < myrefs.ris > myrefs-notex.ris</screen> + <para>As described in the <link linkend="sect-retrieve-pubmed">previous section</link>, you should now add your personal information and then use &appname;c to add the datasets to your database.</para> + </sect3> + <sect3> + <title>Retrieving datasets from a Z39.50 server</title> + <para>Many libraries allow remote access to their electronic catalogs via the Z39.50 protocol. With a suitable client you can search the catalogs and retrieve the bibliographic information of interesting references to your local computer. For this tutorial we'll use the free client provided in the <ulink url="http://www.indexdata.dk/yaz/">YAZ toolkit</ulink>, although you could use any other client as well. One of the largest libraries accessible via the Z39.50 protocol is the <ulink url="http://www.loc.gov">Library of Congress</ulink>. We'll try to find computer books written by some Mr. Knuth in this library.</para> + <para>The following command connects to the library using the host name "z3950.loc.gov", the port 7090, and the database name "Voyager". All this information is usually provided either online or in a printed pamphlet about electronic catalog access published by libraries offering Z39.50 services:</para> + <screen format="linespecific"> + <prompt>~$ </prompt><userinput>yaz-client z3950.loc.gov:7090/Voyager</userinput> Sent initrequest. Connection accepted by target. @@ -729,6 +685,6 @@ <prompt>Z> </prompt> </screen> - <para>Now you can go ahead and type a query. The full query syntax of Z39.50 is beyond the scope of this tutorial, but the following query retrieves entries with the authorname "knuth" and the topic "computer":</para> - <screen format="linespecific"> + <para>Now you can go ahead and type a query. The full query syntax of Z39.50 is beyond the scope of this tutorial, but the following query retrieves entries with the authorname "knuth" and the topic "computer":</para> + <screen format="linespecific"> <prompt>Z> </prompt><userinput>f @and @attr 1=1003 knuth @attr 1=4 @attr 5=1 computer</userinput> Sent searchRequest. @@ -740,5 +696,5 @@ <prompt>Z> </prompt> </screen> - <para>We've found 28 entries that match our search pattern. We could just go ahead and display some or all of them, but we'd like to write them to a file, so we let our client dump all retrieved references to the file <filename moreinfo="none">knuth.loc.usmarc</filename> and make sure the data are retrieved as "usmarc" (again, the library should be able to inform you which formats are available). Other formats acceptable for &appname; are "ukmarc" and "unimarc".</para> + <para>We've found 28 entries that match our search pattern. We could just go ahead and display some or all of them, but we'd like to write them to a file, so we let our client dump all retrieved references to the file <filename moreinfo="none">knuth.loc.usmarc</filename> and make sure the data are retrieved as "usmarc" (again, the library should be able to inform you which formats are available). Other formats acceptable for &appname; are "ukmarc" and "unimarc".</para> <screen format="linespecific"> <prompt>Z> </prompt><userinput>set_marcdump knuth.loc.usmarc</userinput> @@ -746,5 +702,5 @@ <prompt>Z> </prompt> </screen> - <para>Now we retrieve all of the matching entries. The <command moreinfo="none">show</command> command uses an argument like X+Y, where X is the record number where the retrieval should start and Y is the number of consecutive records to be retrieved. The data will be displayed on the screen and written to our file in the background.</para> + <para>Now we retrieve all of the matching entries. The <command moreinfo="none">show</command> command uses an argument like X+Y, where X is the record number where the retrieval should start and Y is the number of consecutive records to be retrieved. The data will be displayed on the screen and written to our file in the background.</para> <screen format="linespecific"> <prompt>Z> </prompt><userinput>show 1+28</userinput> @@ -757,17 +713,207 @@ <prompt>Z> </prompt> </screen> - <para>Finally we can leave the client by typing:</para> + <para>Finally we can leave the client by typing:</para> <screen format="linespecific"> <prompt>Z> </prompt><userinput>quit</userinput> <prompt>~$ </prompt> </screen> - <para>If you attempt to open the resulting MARC file with a text editor or display it with a pager, you'll notice a couple of strange characters. MARC is a binary data format which is not supposed to be readable as plain text. If you want to display the file in a human-readable form, use the tool <command moreinfo="none">marcdump</command> (this is part of the MARC::Record perl module which is required for the <command moreinfo="none">marc2ris.pl</command> converter shipped with &appname;; if there is no marcdump on your system, ask your administrator):</para> + <para>If you attempt to open the resulting MARC file with a text editor or display it with a pager, you'll notice a couple of strange characters. MARC is a binary data format which is not supposed to be readable as plain text. If you want to display the file in a human-readable form, use the tool <command moreinfo="none">marcdump</command> (this is part of the MARC::Record perl module which is required for the <command moreinfo="none">marc2ris.pl</command> converter shipped with &appname;; if there is no marcdump on your system, ask your administrator):</para> <screen format="linespecific"> <prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">marcdump knuth.loc.usmarc | less</userinput> </screen> - <para>The structure of a MARC record is quite complex. It is divided into a leader, fields with three-digit names, indicators, and subfields. No need to understand it at this point, though.</para> - <para>&appname; ships the Perl script <command moreinfo="none">marc2ris.pl</command> which attempts to convert MARC datasets to the RIS format like this:</para> + <para>The structure of a MARC record is quite complex. It is divided into a leader, fields with three-digit names, indicators, and subfields. No need to understand it at this point, though.</para> + <para>&appname; ships the Perl script <command moreinfo="none">marc2ris.pl</command> which attempts to convert MARC datasets to the RIS format like this:</para> <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">marc2ris.pl knuth.loc.usmarc > knuth.loc.ris</userinput></screen> - <para>This will convert the references we downloaded to corresponding references in RIS format which will be written to the file <filename moreinfo="none">knuth.loc.ris</filename>. If you retrieved the data in a different format, use the <option>-t</option> command line option to specify the input file format: "marc21", which is equivalent to USMARC, "unimarc", or "ukmarc". Now you can proceed as described <link linkend="sect-retrieve-pubmed">above</link> and add the contents of this RIS file to your database.</para> + <para>This will convert the references we downloaded to corresponding references in RIS format which will be written to the file <filename moreinfo="none">knuth.loc.ris</filename>. If you retrieved the data in a different format, use the <option>-t</option> command line option to specify the input file format: "marc21", which is equivalent to USMARC, "unimarc", or "ukmarc". Now you can proceed as described <link linkend="sect-retrieve-pubmed">above</link> and add the contents of this RIS file to your database.</para> + </sect3> + </sect2> + <sect2 id="sect-create-risx"> + <title>How to create risx datasets</title> + <para>risx datasets basically carry the same information as RIS datasets, but they use an XML format instead of tagged lines.</para> + <sect3> + <title>What a risx dataset looks like</title> + <para>The main advantages of risx are:</para> + <itemizedlist> + <listitem> + <para>The XML format is a good target for transformation of other bibliographic data in SMGL or XML formats.</para> + </listitem> + <listitem> + <para>XML can be edited using either a general-purpose editor or, even more conveniently, with any XML editor.</para> + </listitem> + <listitem> + <para>XML datasets can be validated, i.e. checked for completeness and for an appropriate structure.</para> + </listitem> + </itemizedlist> + <para>Now lets have a look what the same dataset we had in RIS format above would look like in risx:</para> + <programlisting format="linespecific"> +<![CDATA[ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE ris PUBLIC "-//Markus Hoenicka//DTD Ris V1.0.2//EN" "http://refdb.sourceforge.net/dtd/risx.dtd"> +<ris> + <entry type="BOOK" citekey="smith1975metalloporphyrins"> + <publication> + <title>Porphyrins and metalloporphyrins</title> + <author> + <lastname>Smith</lastname> + <firstname>K</firstname> + <middlename>M</middlename> + </author> + <pubinfo> + <pubdate> + <date> + <year>1975</year> + </date> + </pubdate> + <city>Amsterdam</city> + <publisher>Elsevier Scientific Publishing Company</publisher> + </pubinfo> + </publication> + <libinfo user="markus"> + <reprint status="NOTINFILE" /> + </libinfo> + <contents> + <keyword>Porphyrins</keyword> + <keyword>Metalloporphyrins</keyword> + <keyword>Spectrophotometry [methods]</keyword> + <keyword>spectroscopy</keyword> + </contents> + </entry> +</ris> +]]> +</programlisting> + <para>This is a complete file with just one reference (you could add more <sgmltag class="element">entry</sgmltag> elements for additional references). As you can see, the entry is a lot more verbose compared to RIS due to the spelled-out start and end tags. However, modern XML editors compensate this verbosity with nifty feature like tab completion and automatic insertion of end tags.</para> + <para>You will notice three large blocks of data in this dataset:</para> + <itemizedlist> + <listitem> + <para>The <sgmltag class="element">publication</sgmltag> element contains the bulk of the bibliographic data proper, like the title, the author(s), and the publication date. Simple entry types like the book we see here make do with one level of bibliographic information. Complex types need more than one level. A journal article needs the <sgmltag class="element">part</sgmltag> element for the article proper and the <sgmltag class="element">publication</sgmltag> element for the information related to the journal. A book published as a part of the series needs the <sgmltag class="element">set</sgmltag> element for the series information in addition to the <sgmltag class="element">publication</sgmltag> element.</para> + </listitem> + <listitem> + <para>The <sgmltag class="element">libinfo</sgmltag> element contains the information specific to one &appname; user, like availability information and personal notes. As a matter of fact, a risx dataset can contain an unlimited number of <sgmltag class="element">libinfo</sgmltag> elements, one per user of the system. See also the section about <link linkend="sect-global-personal-fields">global and personal fields</link>.</para> + </listitem> + <listitem> + <para>The <sgmltag class="element">contents</sgmltag> element holds the abstract (not shown here) and keywords.</para> + </listitem> + </itemizedlist> + <para>For further information please visit the <ulink url="http://refdb.sourceforge.net/risx/book1.html">documentation of the risx DTD</ulink>.</para> + </sect3> + <sect3> + <title>Writing risx datasets from scratch</title> + <para>Using your favourite XML editor, writing a risx dataset from scratch should not be exceedingly difficult. The editor should prompt you for required elements and attributes, and refuse to enter an invalid structure. See the example datasets shipped with &appname; to get an idea what different entry types should look like.</para> + </sect3> + <sect3> + <title>Transforming SGML and XML bibliographic data to risx</title> + <para>This topic is somewhat beyond the scope of this introductory tutorial, but if you're familiar with SGML or XML transformations in general, this should not be too hard either. Each input bibliographic format will require a custom DSSSL (for SGML data) or XSLT (for XML data) stylesheet that transforms the data to risx.</para> + </sect3> + <sect3> + <title>Validating risx datasets</title> + <para>If you write risx datasets from scratch or develop your own stylesheets for SGML/XML transformations, it is strongly recommended to validate the results of your laborious efforts. &appname;d uses a non-validating parser to map the risx data to the appropriate database columns. If your input data are invalid, the results might not be to your liking. Two tools come in handy to validate your input data:</para> + <variablelist> + <varlistentry> + <term>onsgmls</term> + <listitem> + <para>This tool is part of the OpenJade package of SGML/XML tools. The following command can be used to validate a risx document:</para> + <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">onsgmls -wxml -s /usr/local/share/refdb/declarations/xml.dcl risxrefs.xml</userinput></screen> + </listitem> + </varlistentry> + <varlistentry> + <term>xmllint</term> + <listitem> + <para>This tool is part of the libxml2 package. Use it like this to validate a risx document:</para> + <screen format="linespecific"><prompt moreinfo="none">~$ </prompt><userinput moreinfo="none">xmllint --valid --noout risxrefs.xml</userinput></screen> + </listitem> + </varlistentry> + </variablelist> + </sect3> + </sect2> + <sect2 id="sect-global-personal-fields"> + <title>Global and personal fields</title> + <para>&appname; differs from other reference management tools because a main goal of its design is to encourage people to share their references. However, you may have figured from the tag list above that some of these entries only make sense if they can be maintained by each user individually. This is precisely the approach used by &appname;: The "hard" bibliographic data are global and identical for each user. The "soft" personal data, which are the only ones likely to change after the reference was added anyway, are maintained for each user individually. These personal fields are:</para> + <itemizedlist> + <listitem> + <para>The reprint status (RP)</para> + </listitem> + <listitem> + <para>The availability field (AV)</para> + </listitem> + <listitem> + <para>The notes field (N1)</para> + </listitem> + </itemizedlist> + <para>Even if you use one of the import filters described below or if you use RIS files exported from other bibliographic software, you should take the time to fill these fields with useful values. If you don't specify values, the AV and N1 field will be blank (this is ok), and the RP field will have the default value "NOT IN FILE".</para> + </sect2> + <sect2> + <title>Character encodings</title> + <para>One seemingly intimidating detail about reference data is the character encoding issue. At the lowest level, a computer doesn't understand anything but two states of a bit: off and on, usually represented as 0 (zero) and 1 (one). Concatenating several bits still doesn't make a text, but a series of binary numbers at best. This is why even text strings are represented as numbers in a computer's memory. Simply put, a character encoding is a lookup table that tells a computer which character to print if it encounters a particular binary number in a byte sequence that represents a text. The well-known ASCII encoding is understood by most computers but covers only 127 characters. Other encodings like Latin-1 contain all ASCII characters plus many special characters used in European languages. Still other encodings are far more versatile in that they allow to encode all characters used by recent and extinct languages. These are the various forms of the Unicode character encodings.</para> + <para>Although many encodings are known by several names, each character encoding has a preferred name which is usually identical with the MIME encoding name (the one you sometimes see in the header of emails). The names are case-insensitive, but otherwise the spelling must match precisely. E.g. UTF-16 and utf-16 are both recognized, whereas utf16 is incorrect.</para> + <para>Now where do these character encodings come into play? First of all, your reference database uses one particular character encoding, set by your administrator. All data that you add to this database will be converted to that encoding, and all data that you retrieve from this database will have to be converted from that encoding if necessary. To find out what encoding your database uses, run this command in &appname;c:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>whichdb</userinput> +Current database: refs +Number of references: 34 +Highest reference ID: 34 +Number of notes: 0 +Highest note ID: 0 +Encoding: UTF-8 +Database type: risx +Database server: pgsql +Created: 2004-02-07 20:39:02 UTC +Using refdb version: 0.9.4-pre6 +Last modified: 2004-02-09 21:43:10 UTC +</screen> + <para>In this example, the database uses the UTF-8 encoding, one of the most versatile Unicode encodings. Now, how do you convert your input data to e.g. UTF-8? Fortunately you don't have to, at least in most cases, as &appname; does this for you on the fly. It just needs to know what encoding your input data use. The two input data formats employ two different ways to specify the character encoding:</para> + <variablelist> + <varlistentry> + <term>RIS</term> + <listitem> + <para>RIS data do not have a built-in mechanism to record the character encoding. You will have to tell &appname; explicitly. You do this by using the <option>-E encoding</option> option with the <link linkend="sect-add-update-refs">addref</link> command. Allowed are all encodings that your operating system can deal with. The most common examples are UTF-8, ASCII, and ISO-8859-1 through -15 (the various character sets for European languages).</para> + </listitem> + </varlistentry> + <varlistentry> + <term>risx</term> + <listitem> + <para>As shown in the <link linkend="sect-create-risx">risx example above</link>, each file containing risx data should specify the encoding in the processing instructions (the very first line of an XML file). Allowed are only four encodings: UTF-8, UTF-16, ASCII, and ISO-8859-1.</para> + </listitem> + </varlistentry> + </variablelist> + <para>After you've added your data to the database, you're not yet done with encodings. The same issue pops up when you <link linkend="sect-finding-refs">retrieve datasets from the database</link>. By default, &appname; sends the data using the same encoding as the database uses. However, you can retrieve the data using any encoding that your platform supports.</para> + </sect2> + <sect2 id="sect-add-update-refs"> + <title>How to add and update references</title> + <para>In most cases you have a new set of references and want to add them to your database. Assuming your RIS references are stored in a file <filename moreinfo="none">newrefs.ris</filename> in the present working directory, all you need to do is:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref newrefs.ris</userinput></screen> + <para>To simply add the references in the example RIS file, use this command:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref /usr/local/share/&appname;/examples/testrefs.ris</userinput></screen> + <para>We have not used the <option>-E</option> option to select an encoding here, as the example data uses the ISO-8859-1 encoding which we have set as the default in our config file. If the input data were encoded in UTF-8, we'd do the following instead:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref -E UTF-8 /usr/local/share/&appname;/examples/testrefs.ris</userinput></screen> + <para>If you have references in the risx format instead, you'll have to tell &appname; so. Do this with the <option>-t risx</option> switch:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref -t risx newrefs.xml</userinput></screen> + <para>To add the example risx data, use this command:</para> + <screen format="linespecific"><prompt moreinfo="none">&appname;c: </prompt><userinput>addref -t risx /usr/local/share/&appname;/examples/testrefs.xml</userinput></screen> + <para>Remember that risx data carry their encoding information in the processing instructions, so there is no need for using the <option>-E</option> option.</para> + <para>&appname;c will try to add the references stored in these files to your default database. The diagnostic messages will be displayed in your pager, so if you send a dozen or so references it might take a few seconds until the results are displayed. You'll see a message for each reference found in the input file: Which ID was assigned, which citation key was used (or generated if you didn't specify one), and whether the operation was successful. Adding references usually fails only for two reasons:</para> + <itemizedlist> + <listitem> + <para>The input data were not the type of data that &appname; expected. Either the data were simply corrupt, or there was a mismatch between the data type and the value of the <option>-t</option> option.</para> + </listitem> + <listitem> + <para>A citation key was specified in the reference but the same citation key already exists in the database. &appname; will refuse to accept the reference because citation keys <emphasis>must</emphasis> be unique. You can fix this by changing or deleting the offending citation key in the input file.</para> + </listitem> + </itemizedlist> + <para>Once a reference is added to the database, you might still feel the urge to change it. Be it that you would like to add further keywords or that your personal information, like the reprint status, have changed since. The most straightforward way to change a reference is to retrieve it in either RIS or risx format, save it to a file, edit it, and send the updated copy back to where it came from. The following sequence of commands shows this, assuming we want to use the RIS format:</para> + <note> + <para>In this example we'll assume that you already know the ID of the reference that you want to change. You'll learn <link linkend="sect-finding-refs">later</link> how to find a reference by all sorts of criteria like authors, keywords and the like. This section also has additional information on the <command moreinfo="none">getref</command> command used here.</para> + </note> + <screen format="linespecific"> +<prompt moreinfo="none">&appname;c: </prompt><userinput moreinfo="none">getref -t ris -o editme.ris :ID:=7</userinput> +2595 byte written to /usr/home/markus/refdb/editme.ris +<prompt moreinfo="none">&appname;c: </prompt> +</screen> + <para>Now you can use your favourite text editor to change the file <filename moreinfo="none">editme.ris</filename> as you see fit. For this exercise we'll just change the reprint status (the RP field) from "NOT IN FILE" to "IN FILE". When you're done, save the file and go back to &appname;c:</para> + <screen format="linespecific"> +<prompt moreinfo="none">&appname;c: </prompt><userinput moreinfo="none">updateref -P editme.ris</userinput> +Updating input set 1 successful +1 dataset(s) updated, 0 added, 0 failed +1 dataset(s) sent. +</screen> + <para>Now what was that <option>-P</option> switch good for? This switch tells &appname; that it should only update your personal information of this reference, i.e. the RP, AV, and N1 fields. This is a lot faster than updating the whole reference. It is also more secure as you might have changed the file somewhere else accidentally without noticing. On the other hand, if you e.g. correct a typo you noticed in the title (TI) field, you <emphasis>must not</emphasis> use the <option>-P</option> switch.</para> </sect2> </sect1> @@ -795,9 +941,10 @@ <prompt>refdbc: </prompt><userinput>getref -h</userinput> Displays the result of a database search. -Syntax: getref [-c command] [-d database] [-h] [-o outfile] [-O outfile][-P] [-R pdfroot] [-s format] [-S tag] [-t output-format] {search-string|-f infile} -Search-string: {:XY:{<|=|!=|>}{unix-regexp}} [AND|OR|AND NOT] [...] +Syntax: getref [-c command] [-d database] [-E encoding] [-h] [-o outfile] [-O outfile][-P] [-R pdfroot] [-s format] [-S tag] [-t output-format] {search-string|-f infile} +Search-string: {:XY:{<|=|~|!=|!~|>}{string|regexp}} [AND|OR|AND NOT] [...] where XY specifies the field to search in Options: -c command pipe the output through command -d database specify the database to work with + -E encoding set the output character encoding -h prints this mini-help -o outfile save the output in outfile (overwrite) @@ -807,5 +954,5 @@ -s format specify fields for screen or style for DocBook output -S tag sort output by tag ID (default) or PY - -t output-format display as format scrn, html, db31, teix, ris, or bibtex + -t output-format display as format scrn, html, xhtml, db31, db31x, teix, ris, risx, or bibtex -f infile use the saved search line in file infile All other arguments are interpreted as the search string. @@ -850,5 +997,5 @@ </screen> <para>As all references have an ID value greater than 0, this command catches them all. But beware, this could literally be thousands of references, so don't keep your server busy just for fun.</para> - <para>In most cases you have some idea about the reference you're looking for. Either you know the name of an author, or when the document was published. Maybe you know a word or a phrase from the title, or you want to use keywords to look up references about a particular topic. The <command moreinfo="none">getref</command> query language allows you to use all data fields in any combination to retrieve references. Let's first have a look at what fields are available besides the ID field we already know.</para> + <para>In most cases you have some idea about the reference you're looking for. Either you know the name of an author, or when the document was published. Maybe you know a word or a phrase from the title, or you want to use keywords to look up references about a particular topic. The <command moreinfo="none">getref</command> query language allows you to use all data fields in any combination to retrieve references. Let's first have a look at what fields are available besides the ID field we saw above.</para> <variablelist> <varlistentry> @@ -997,8 +1144,23 @@ </varlistentry> </variablelist> + <para>In addition to the above field specifiers, there are a few that allow to retrieve references based on extended notes attached to them (see <link linkend="sect-adding-extended-notes">below</link> for an explanation of extended notes):</para> + <variablelist> + <varlistentry> + <term>:NID:</term> + <listitem> + <para>The ID of an extended note.</para> + </listitem> + </varlistentry> + <varlistentry> + <term>:NCK:</term> + <listitem> + <para>The alphanumeric key of an extended note.</para> + </listitem> + </varlistentry> + </variablelist> </sect3> <sect3> <title>Doing comparisons</title> - <para>We have to distinguish between numeric and alphanumeric fields, as indicated in the list above. This determines which comparison operators are available for that particular field. Alphanumeric fields can use the operators "=" (equality) and "!=" (non-equality). Numeric fields can use the operators "<" (less than) and ">" (greater than) in addition to the former. The comparison of numeric fields should be straightforward, but the comparison of alphanumeric field needs a little further elucidation. Alphanumeric comparisons use a Unix-style <emphasis>regular expression</emphasis> on the right-hand side of the operator. The query matches if the regular expression finds a match somewhere in the text stored in the requested field. That is, the comparison ":N1:=warts" would return a result if the character sequence "warts" is somewhere in the text stored in the notes (N1) field.</para> + <para>We have to distinguish between numeric and alphanumeric fields, as indicated in the list above. This determines which comparison operators are available for that particular field. Alphanumeric fields can use the operators "=" (literal equality) and "!=" (literal non-equality) as well as "~" (regular expression equality) and "!~" (regular expression non-equality). Numeric fields can use the operators "=" (equality), "!=" (non-equality), "<" (less than), and ">" (greater than). The comparison of numeric fields should be straightforward, but the comparison of alphanumeric field needs a little further elucidation. Alphanumeric comparisons use either literal strings or <emphasis>regular expressions</emphasis> on the right-hand side of the operator. In the first case, the query matches if the whole string in the field indicated on the left is identical ("=") or not identical ("!=") to the string on the right. In the second case, the query matches if the regular expression finds a match somewhere in the text stored in the requested field. That is, the comparison ":N1:~'warts'" would return a result if the character sequence "warts" is somewhere in the text stored in the notes (N1) field. On the other hand, the comparison ":N1:='warts' would match only if a dat... [truncated message content] |