<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at
  
       http://www.apache.org/licenses/LICENSE-2.0
  
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<!--
Author:  Nadezhda Morozova
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "hcodep://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Documentation Conventions</title>
<link rel=Stylesheet type="text/css" media=all href=harmony.css>


<body>
<h1><a name="Notation_Conventions">Documentation Conventions</a></h1>
<P> The Harmony documentation set uses the following conventions. </P>
<table border=1 width="100%">
 <tr>
 <td class="TableHeading">Convention </td>
 <td class="TableHeading"> Explanation&nbsp;</td>
 <td class="TableHeading">Example</td>
 </tr>
 <tr>
 <td rowspan="5"><code>monospace</code> </td>
 <td class="TableCell"> Filenames</td>
 <td><code> ippsapi.h</code></td></tr>
 <tr>
 <td class="TableCell"> Directory names and pathnames </td>
 <td><code> \alt\include</code></td>
 </tr>
 <tr>
 <td class="TableCell"> Commands and command-line options</td> <td><code> ecl 
	-O2</code></td>
 </tr>
 <tr>
 <td class="TableCell"> Function names, methods, classes, data structures in 
	running text </td>
 <td class="TableCell">Use the <code> okCreateObjs </code> function to ...</td>
 </tr>
 <tr>
 <td class="TableCell"> Parameters or other placeholders &nbsp;</td>
    <td><code>ippiMalloc(int widthPixels, ...)<br>
      int* pStepBytes</code></td>
 </tr>
 <tr>
 <td class="TableCell"><code><b> monospace bold&nbsp; </b></code></td>
 <td class="TableCell"> User input </td>
 <td class="TableCell"><code> [c:] <b> dir</b></code></td>
 </tr>
 <tr>
 <td class="TableCell"><i>italics </i></td>
 <td class="TableCell"> Emphasis; introducing or defining terms</td>
 <td class="TableCell"> The term <i> access</i> takes as its subject ... </td>
 </tr>
 <tr>
 <td class="TableCell"> [ ]</td>
 <td class="TableCell"> Optional items</td>
 <td class="TableCell"><code> -Fa[c]</code> Indicates these command-line 
	options: <code> -Fa</code> and <code> -Fac</code></td>
 </tr>
 <tr>
 <td class="TableCell"> { | }  </td>
 <td class="TableCell"> Choice of one item from a selection of two or more 
	items. </td>
 <td class="TableCell"><code> -aX{K | W | P}</code> Indicates these command-line 
	options: <code><br> -aXK <br> -aXW <br> -aXP</code></tr></table>
</body>

</html>
