pdf viewer c# open source : Creating bookmarks in pdf from word control Library platform web page asp.net azure web browser calibre9-part897

calibre User Manual, Release 2.56.0
Words are shown with the number of times they occur in the book and the language the word belongs to. Language
information is taken from the books metadata and from lang attributes in the HTML files. This allows the spell
checker to work well even with books that contain text in multiple languages. For example, in the following HTML
extract, the word color will be checked using American English and the word colourusing British English:
<div lang="en_US">color <span lang="en_GB">colour</span></div>
Note: You can double click a word to highlight the next occurrence of that word in the editor. This is useful if you
wish to manually edit the word,or see what context it is in.
To change a word, simply double click one of the suggested alternative spellings on the right, or type in your own
corrected spelling and click the Change selected word to button. This will replace all occurrences of the word in the
book. You can also right click on a word in the main word list to change the word conveniently from the right click
menu.
You can have the spelling checker ignore a word for the current session by clicking the Ignore button. You can also
adda wordto the userdictionary byclicking the Add to dictionary button. The spellingchecker supports multiple user
dictionaries, so you can select the dictionary you want the word added to.
You can also have the spelling checkerdisplay all the words in your book, not just the incorrectly spelled ones. This is
useful to see what words are most common in yourbook and to run a simple search and replace on individual words.
Note: If you make any changes to the book by editing files while the spell check tool is open, you should click the
Refresh button inthe spell check tool. Ifyou do not do this and continue to use the spellchecktool, you could lose the
changes you have made in the editor.
Addingnew dictionaries
The spelling checker comes with builtin dictionaries for the English and Spanish languages. You can install your
own dictionaries via Preferences->Editor->Manage spelling dictionaries. The spell checkercanuse dictionaries from
the LibreOffice program (in the .oxt format). You can download these dictionaries fromTheLibreOfficeExtensions
repository
33
.
Inserting special characters
You can insert characters that are difficult to type by using the Edit->Insert special character tool. This shows you all
unicode characters, simply click on the character you want to type. If you hold Ctrl while clicking, the window will
close itselfafter insertingthe selected character. This tool canbe used to insert special characters into the main text or
into any other area of the user interface, such as the Search and replace tool.
Because there are a lot of characters, you can define your own Favorite characters, that will be shown first. Simply
right click on a character to mark it as favorite. You can also right click on a character in favorites to remove it from
favorites. Finally, you can re-arrange the order of characters in favorites by clicking the Re-arrange favorites button
and then drag and dropping the characters in favorites around.
You can also directly type in special characters using the keyboard. To do this, you type the unicode code for the
character (in hexadecimal) and then press the Alt+X key which will convert the previously typed code into the cor-
responding character. For example, to type ÿ you would type ff and then Alt+X. To type a non-breaking space you
would use a0 and then Alt+X,to type the horizontal ellipsis you would use 2026 and Alt+X and so on.
33
http://extensions.libreoffice.org/extension-center?getCategories=Dictionary&getCompatibility=any&sort_on=positive_ratings
1.5. Editing E-books
87
Creating bookmarks in pdf from word - add, remove, update PDF bookmarks in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your C# Project with Rapid PDF Internal Navigation Via Bookmark and Outline
bookmarks pdf file; add bookmarks to pdf
Creating bookmarks in pdf from word - VB.NET PDF bookmark library: add, remove, update PDF bookmarks in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your VB.NET Project with Rapid PDF Internal Navigation Via Bookmark and Outline
create pdf bookmark; how to bookmark a pdf page
calibre User Manual, Release 2.56.0
Finally, you can type in special characters by using HTML named entities. For example, typing &nbsp; will be
replaced by a non breaking space when you type the semi-colon. The replacement happens only when typing the
semi-colon.
The code inspector view
This view shows you the HTML coding and CSS that applies to the current element of interest. You open it by right
clicking a location in the preview panel and choosing Inspect. It allows you to see the HTML coding for that element
and more importantly, the CSS styles that apply to it. You can even dynamically edit the styles and see what effect
your changes have instantly. Note that editing the styles does not actually make changes to the book contents,it only
allows forquick experimentation. The ability to live edit inside the Inspector is under development.
Checking external links
You can use this tool to check all links in your book that point to external websites. The tool will try to visit every
externally linked website, and if the visit fails, it will report all broken links in a convenient format for you to fix.
Arranging files into folders by type
Oftenwhen editingEPUB files that you get fromsomewhere, you willfind that the files inside the EPUB are arranged
haphazardly, in different sub-folders. This tool allows you to automatically move all files into sub-folders based on
their types. Access it via Tools->Arrange into folders. Note that this tool only changes how the files are arranged
inside the EPUB,it does not change how they are displayed in the Files Browser.
Importing files in other e-book formats as EPUB
The editor includes the ability to import files in some other e-book formats directly as a new EPUB, without going
through a full conversion. This is particularly useful to directly create EPUB files fromyour own hand-edited HTML
files. You can do this via File->Import an HTML or DOCX file as a new book.
Function Mode for Search& Replace inthe Editor
The Search & Replace tool in the editor support a function mode. In this mode, you can combine regular expressions
(seeAllaboutusingregularexpressionsincalibre (page 161)) with arbitrarily powerful python functions to do all
sorts of advanced text processing.
In the standard regexp mode for search and replace, you specify both a regular expression to search for as well as a
template that is used to replace all foundmatches. In function mode, instead of using a fixed template, you specify an
arbitrary function, in thepythonprogramminglanguage
34
. This allows you to do lots of things that are not possible
with simple templates.
Techniques for using function mode and the syntax will be described by means of examples, showing you how to
create functions to perform progressively more complex tasks.
34
https://docs.python.org/2.7/
88
Chapter 1. Sections
C# Create PDF Library SDK to convert PDF from other file formats
Gratis control for creating PDF from multiple image formats such as tiff, jpg, png Create and save editable PDF with a blank page, bookmarks, links, signatures
edit pdf bookmarks; add bookmarks to pdf reader
VB.NET Create PDF Library SDK to convert PDF from other file
Gratis control for creating PDF from multiple image formats such as tiff, jpg, png Create and save editable PDF with a blank page, bookmarks, links, signatures
bookmarks in pdf from word; add bookmark to pdf reader
calibre User Manual, Release 2.56.0
Automatically fixing the case of headings in the document Here, we will leverage one of the builtin functions in
the editor to automatically change the case of all text inside heading tags to title case:
Find expression: <([Hh][1-6])[^>]
*
>.+?</\1>
For the function,simply choose the Title-case text (ignore tags) builtin function. The will change titles that look like:
<h1>some TITLE</h1> to <h1>Some Title</h1>. It will work even if there are other HTML tags inside
the heading tags.
Your firstcustomfunction-smarteninghyphens The realpoweroffunctionmodecomes frombeing abletocreate
your own functions to process text in arbitrary ways. The Smarten Punctuation tool in the editor leaves individual
hyphens alone, so you can use the this function to replace them with em-dashes.
To create a new function, simply click the Create/Edit button to create a new function and copy the python code from
below.
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
return match.group().replace('--''--').replace('-''--')
Every Search & Replace custom function must have a unique name and consist of a python function named replace,
that accepts all the arguments shown above. For the moment, we wont worry about all the different arguments to
replace() function. Just focus on the match argument. It represents a match when running a search and replace.
Its full documentation in availablehere
35
. match.group() simply returns all the matched text and all we do is
replace hyphens in that text with em-dashes, first replacing double hyphens and then single hyphens.
Use this function with the find regularexpression:
>[^<>]+<
And it will replace all hyphens with em-dashes,but only in actual text and not inside HTML tag definitions.
The power of function mode - using a spelling dictionary to fix mis-hyphenated words Often, ebooks created
from scans ofprinted books contain mis-hyphenated words – words that were split at the end ofthe line on the printed
page. We will write a simple function to automatically find and fix such words.
import regex
from calibre import replace_entities
from calibre import prepare_string_for_xml
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
def replace_word(wmatch):
# Try to remove the hyphen and replace the words if the resulting
# hyphen free word is recognized by the dictionary
without_hyphen = wmatch.group(1+ wmatch.group(2)
if dictionaries.recognized(without_hyphen):
return without_hyphen
return wmatch.group()
# Search for words split by a hyphen
text = replace_entities(match.group()[1:-1])
# Handle HTML entities like &amp;
corrected = regex.sub(r'(\w+)\s
*
-\s
*
(\w+)', replace_word, , text, flags=regex.VERSION1 regex.UNICODE)
return '>%s<' prepare_string_for_xml(corrected)
# Put back required entities
Use this function with the same find expression as before, namely:
35
https://docs.python.org/2.7/library/re.html#match-objects
1.5. Editing E-books
89
XDoc.Word for .NET, Advanced .NET Word Processing Features
Viewing, editing, converting, processing, creating, annotating and zooming & rotation; Outlines, bookmarks, & thumbnail Create Word from PDF; Create Word from
excel pdf bookmarks; how to create bookmark in pdf automatically
VB.NET PDF: Basic SDK Concept of XDoc.PDF
features can be integrated into your VB.NET project, such as annotation creating, deleting, modifying This class describes bookmarks in a PDF document.
convert word pdf bookmarks; how to bookmark a page in pdf document
calibre User Manual, Release 2.56.0
>[^<>]+<
And it will magically fix all mis-hyphenated words in the text of the book. The main trick is to use one of the useful
extra arguments to the replace function, dictionaries. This refers to the dictionaries the editoritself uses to spell
check text in the book. What this function does is look for words separated by a hyphen, remove the hyphen and
check if the dictionary recognizes the composite word, if it does, the original words are replaced by the hyphen free
composite word.
Note that one limitation of this technique is it will only work for mono-lingual books, because, by default,
dictionaries.recognized() uses the main language of the book.
Autonumbering sections Now we willsee somethinga littledifferent. Suppose yourHTML file has many sections,
each with a heading in an <h2> tag that looks like <h2>Some text</h2>. You can create a customfunction that
will automatically number these headings with consecutive section numbers, so that they look like <h2>1.
Some
text</h2>.
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
section_number '%d. ' % number
return match.group(1section_number match.group(2)
# Ensure that when running over multiple files, the files are processed
# in the order in which they appear in the book
replace.file_order 'spine'
Use it with the find expression:
(?s)(<h2[^<>]
*
>)(.+?</h2>)
Place the cursor at the top ofthe file and click Replace all.
This function uses another of the useful extra arguments to replace(): the number argument. When doing a
Replace All number is automatically incremented forevery successive match.
Another new feature is the use of replace.file_order – setting that to ’spine’ means that if this search is
run on multiple HTML files, the files are processed in the order in which they appear in the book. SeeChoosefile
order when running on multiple HTMLfiles(page93)fordetails.
AutocreateaTableofContents Finally,lets try something alittle more ambitious. Supposeyourbookhas headings
in h1 and h2 tags that look like <h1 id="someid">Some Text</h1>. We will auto-generate an HTML Table
ofContents based on these headings. Create the custom function below:
from calibre import replace_entities
from calibre.ebooks.oeb.polish.toc import TOC, toc_to_html
from calibre.gui2.tweak_book import current_container
from calibre.ebooks.oeb.base import xml2str
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
if match is None:
# All matches found, output the resulting Table of Contents.
# The argument metadata is the metadata of the book being edited
if 'toc' in data:
toc = data['toc']
root = TOC()
for (file_name, tag_name, , anchor, , text) in toc:
parent = root.children[-1if tag_name == 'h2' and root.children else root
parent.add(text, file_name, anchor)
toc = toc_to_html(root, current_container(), 'toc.html''Table of f Contents s for ' + metadata.title, metadata.language)
90
Chapter 1. Sections
How to C#: Basic SDK Concept of XDoc.PDF for .NET
annotation features can be integrated into your C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a PDF document
creating bookmarks in pdf from word; create bookmarks in pdf
How to C#: Basic SDK Concept of XDoc.Word
Conversely, conversion from PDF to Word (.docx) is C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a Word document
acrobat split pdf bookmark; creating bookmarks in pdf documents
calibre User Manual, Release 2.56.0
print (xml2str(toc))
else:
print ('No headings s to o build ToC C from found')
else:
# Add an entry corresponding to this match to the Table of Contents
if 'toc' not in data:
# The entries are stored in the data object, which will persist
# for all invocations of this function during a 'Replace All' operation
data['toc'= []
tag_name, anchor, text = match.group(1), replace_entities(match.group(2)), replace_entities(match.group(3))
data['toc'].append((file_name, tag_name, anchor, text))
return match.group()
# We don't want to make any actual changes, so return the original matched text
# Ensure that we are called once after the last match is found so we can
# output the ToC
replace.call_after_last_match True
# Ensure that when running over multiple files, this function is called,
# the files are processed in the order in which they appear in the book
replace.file_order 'spine'
And use it with the find expression:
<(h[12]) [^<>]
*
id=['"]([^'"]+)['"][^<>]
*
>([^<>]+)
Run the search on All text files and at the end of the search, a window will popup with “Debug Output from your
function” which will have the HTML Table of Contents,ready to be pasted into toc.html.
The function above is heavily commented, so it should be easy to follow. The key new feature is the use of another
useful extra argument to the replace() function, the data object. The data object is a python dict that persists
between all successive invocations of replace() during a single Replace All operation.
Another new feature is the use ofcall_after_last_match – setting thatto True onthe replace() function
means that the editor will call replace() one extra time after all matches have been found. For this extra call, the
match object will be None.
This was just a demonstration to show you the power of function mode, if you really needed to generate a Table of
Contents from headings in your book, you would be better off using the dedicated Table of Contents tool in Tools-
>Table of Contents.
The API for the function mode All function mode functions must be python functions named replace, with the
following signature:
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
return a_string
When a find/replace is run, for every match that is found, the replace() function will be called, it must return the
replacement string for that match. Ifno replacements are to be done, it should return match.group() which is the
original string. The various arguments tothe replace() function are documentedbelow.
The match argument The match argument represents the currently found match. It is apythonMatchobject
36
.
It’s most useful method is group() which can be used to get the matched text corresponding to individual capture
groups in the search regular expression.
36
https://docs.python.org/2.7/library/re.html#match-objects
1.5. Editing E-books
91
How to C#: Basic SDK Concept of XDoc.PowerPoint
Conversely, conversion from PDF to PowerPoint (.PPTX C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a PowerPoint
export pdf bookmarks to excel; how to create bookmark in pdf with
PDF Image Viewer| What is PDF
such as text extraction, hyperlinks, bookmarks and metadata as to develop specifications for creating, viewing, and convert word document without need for PDF.
add bookmarks to pdf online; adding bookmarks to a pdf
calibre User Manual, Release 2.56.0
The number argument The number argument is the number of the current match. When you run Replace All,
every successive match will cause replace() to be called with an increasing number. The first match has number
1.
The file_name argument This is the filename of the file in which the current match was found. When searching
inside marked text, the file_name is empty. The file_name is in canonical form,a pathrelative to the root of the
book,using / as the path separator.
The metadata argument This represents the metadata of the current book, such as title, authors, language, etc.
It is an object of classcalibre.ebooks.metadata.book.base.Metadata (page 153). Useful attributes
include, title,authors (a list of authors) and language (the language code).
The dictionaries argument This represents the collection of dictionaries used for spell checking the current
book. It’s most useful method is dictionaries.recognized(word) which will return True if the passed in
wordis recognized by the dictionary forthe current book’s language.
The data argument This a simple python dict. When you run Replace All, every successive match will cause
replace() to be calledwith the same dict as data. You can thus use it to store arbitrary data between invocations
ofreplace() during a Replace All operation.
The functions argument The functions argument gives you access to all other user defined functions. This
is useful for code re-use. You can define utility functions in one place and re-use themin all yourother functions. For
example,suppose you create a function name My Function like this:
def utility():
# do something
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
...
Then, in another function, you can access the utility() function like this:
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
utility = functions['My Function']['utility']
...
You can also use the functions objectto store persistent data, that canbe re-usedby otherfunctions. For example,you
could have one function that when run with Replace All collects some data and another function that uses it whenit is
run afterwards. Consider the following two functions:
# Function One
persistent_data = {}
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
...
persistent_data['something''some data'
# Function Two
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
persistent_data = functions['Function One']['persistent_data']
...
92
Chapter 1. Sections
How to C#: Basic SDK Concept of XDoc.Excel
Conversely, conversion from PDF to Excel (.XLSX) is also C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a Excel
convert word to pdf with bookmarks; bookmark page in pdf
calibre User Manual, Release 2.56.0
Debugging your functions You can debug the functions you create by using the standard print() function from
python. The output of print will be displayed in a popup window after the Find/replace has completed. You saw an
example of using print() to output an entire table of contents above.
Choose file order when running on multiple HTML files When you run a Replace All on multiple HTML files,
the order inwhich the files are processes depends on what files you have open for editing. You can force the search to
process files in the order in which the appear bysetting the file_order attribute on yourfunction,like this:
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
...
replace.file_order 'spine'
file_order accepts two values,spine andspine-reverse which cause the search to process multiple files in
the order they appear in the book, either forwards orbackwards, respectively.
Having your functioncalled an extra time after the last matchis found Sometimes,as in the auto generate table
ofcontents example above,itis useful tohave yourfunction calledan extratime after the lastmatch is found. You can
do this by settingthe call_after_last_match attribute on yourfunction,like this:
def replace(match, number, , file_name, metadata, , dictionaries, , data, functions,
*
args,
**
kwargs):
...
replace.call_after_last_match True
Snippets
The calibre editor supports snippets. A snippet is a piece of text that is either re-used often or contains a lot of
redundant text. The editor allows you to insert a snippet with only a few key strokes. For example, suppose you
often find yourself inserting link tags when editing HTML files, then you can simply type <a in the editor and press
Control+J.The editor will expand it to:
<a href="filename"></a>
Not only that, the word filename will be selected,with the cursor placed over it, so that you can easily type in the
real filename, using the editor’s niftyAuto-complete(page 97) feature. And once you are done typing the filename,
press Control+J again and the cursor will jump to the position in between the <a> tags so you can easily type in
the text forthe link.
The snippets system in the editor is very sophisticated, there are a few built-in snippets and you can create your own
to suit your editing style.
The following discussion of the built-in snippets should help illustrate the power of the snippets system.
Note: Youcan alsouse snippets inthe textentry fields in the Searchand Replace panel, however, placeholders (using
Control+J to jump around) will not work.
The built-in snippets The built-in snippets are described below. Note that you can override them by creating your
own snippets with the same trigger text.
1.5. Editing E-books
93
calibre User Manual, Release 2.56.0
Inserting filler text [Lorem] The first built-in snippet, and the simplest is used to insert filler text into a document.
The fillertext is taken fromDefinibusbonorumetmalorum
37
aphilosophical work by Cicero (translated to English).
To use it simply type Lorem in an HTML file and press Control+J. It will be replaced by a couple of paragraphs
offiller.
The definition ofthis snippet is very simple,the triggertext is defined as Lorem and the template is defined simply as
the literal text to be inserted. You can easily customize it to use your favorite form offiller text.
Inserting a self-closing HTML tag [<>] Now let’s look at a simple example of the powerful concept of placehold-
ers. Say you want to insert the self-closing tag <hr/>. Just type <>, and press Control+J, the editor will expand
the snippet to:
<|/>
Here, the | symbol represents the current cursor position. You can then type hr and press Control+J to move the
cursor to after the end ofthe tag. This snippet is defined as:
Trigger: <>
Template: <$1/>$2
Placeholders are simply the dollar ($) sign followed by a number. When the snippet is expanded by pressing
Control+J the cursor is positioned at the first placeholder (the placeholder with the lowest number). When you
press Control+J again the cursor jumps to the next placeholder (the placeholderwith the next higher number).
Inserting an HTML link tag [<a] HTML link tags all share a common structure. They have an href attribute
and some text between the opening and closing tags. A snippet to make typing them more efficient will introduce us
to some more features of placeholders. To use this snippet, simply type <a and press Control+J. The editor will
expandthis to:
<a href="filename|"></a>
Not only that, the word filename will be selected,with the cursor placed over it, so that you can easily type in the
real filename, using the editor’s niftyAuto-complete(page 97) feature. And once you are done typing the filename,
press Control+J again and the cursor will jump to the position in between the <a> tags so you can easily type in
the text for the link. After you are done typing the text, press Control+J again to jump to the point afterthe closing
tag. This snippet is defined as:
Trigger: <a
Template: <a href="${1:filename}">${2
*
}</a>$3
There are a couple of new features here. First the $1 placeholder has become more complex. It now includes some
default text (the word filename. If a placeholder contains default text, the default text is substituted for the place-
holderwhen the snippet is expanded. Also when you jump to a placeholder with default text using Control+J, the
default text is selected. In this way,you can use default text to act as a reminder to you to fill in important parts of the
template. You can specify default text fora placeholder by using the syntax: ${<number>:default text}.
The other new feature is that the second placeholder has an asterisk after it (${2
*
}). This means that any text that
was selected before expanding the template is substituted for the placeholder. To see this in action, select some text in
the editor, press Control+J, type <a and press Control+J again, the template will be expanded to:
<a href="filename">whatever text t you u selected</a>
37
http://en.wikipedia.org/wiki/De_finibus_bonorum_et_malorum
94
Chapter 1. Sections
calibre User Manual, Release 2.56.0
Inserting aHTML imagetag [<i] This is very similar to insertingan HTML link,as we saw above. It allows you to
quickly input an <img src="filename" alt="description" /> tag and jump between the src and alt
attributes:
Trigger: <i
Template: <img src="${1:filename}" alt="${2
*
:description}" />$3
Insert an arbitrary HTML tag [<<] This allows you to insert an arbitrary full HTML tag (or wrap previously
selected text in the tag). Touse it, simply type << and press Control+J.The editor will expand it to:
<|></>
Type the tag name, for example: span and press Control+J,that will result in:
<span>|</span>
You will note that the closing tag has been automatically filled with span. This is achieved with yet another feature
of placeholders, mirroring. Mirroring simply means that if you specify the sample placeholder more than once in a
template, the second and all later positions will be automatically filled in with whatever you type in the first position,
when you press Control+J.The definition forthis snippet is:
Trigger: <<
Template: <$1>${2
*
}</$1>$3
As you can see, the first placeholder ($1) has been specified twice, the second time in the closing tag, which will
simplycopy whatever you type in the opening tag.
Insertinganarbitrary HTML tagwithaclass attribute[<c] This isverysimilartothe insertarbitrarytagexample
above, except that it assumes that you want to specify a class forthe tag:
Trigger: <c
Template: <$1 class="${2:classname}">${3
*
}</$1>$4
This will allow you to first type the tag name, press Control+J, type the class name, press Control+J type the
contents of the tag and press Control+J one last time to jump out ofthe tag. The closing tag will be auto-filled.
Creating your own snippets Snippets really shine because you can create your own to suit your editing style. To
create your own snippets go to Edit->Preferences->Editor settings->Manage snippets in the editor. This will pop-up
an easy to use dialog to help you create your own snippets. Simply click the Add snippet button and you will see a
dialog that looks like:
1.5. Editing E-books
95
calibre User Manual, Release 2.56.0
First give your snippet a name, something descriptive, to help identify the snippet in the future. Then specify the
trigger. A triggeris simplythe text that you have to type in the editor before pressing Control+J inorderto expand
the snippet.
Then specify the snippet template. You should start with one of the example above and modify it to suit your needs.
Finally, specify which file types you want the snippet to be active for. This way you can have multiple snippets with
the same trigger text that work differently in different file types.
The next step is to test your newly created snippet. Use the Test box at the bottom. Type in the trigger text and press
Control+J to expand the snippet and jump between placeholders.
The Reports tool
The editor includes a nice Reports tool (via Tools->Reports) that shows summaries of the files, images, links, words,
characters andstyles usedin the book. Every line in the report is hot-linked. Double clicking a line jumps to the place
in the book where that item is used or defined (as appropriate). For example, in the Links view, you can double click
entries the Source column to jump to where the link is defined and entries in the Target column to jump to where the
link points.
96
Chapter 1. Sections
Documents you may be interested
Documents you may be interested