https://docs.moodle.org/25/en/api.php?action=feedcontributions&user=Stronk7&feedformat=atom
MoodleDocs - User contributions [en]
2024-03-28T21:08:57Z
User contributions
MediaWiki 1.39.6
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=106185
Installing MSSQL for PHP
2013-07-26T12:08:14Z
<p>Stronk7: Taking rid of warning caused by MDL-37734</p>
<hr />
<div>{{Installing Moodle}}== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
Configure these settings in your created (and still empty) database:<br />
:*Use a case sensitive collation, such as Latin1_General_CS_AS.<br />
:*ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:*Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* (Moodle 2.x only) Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON)<br />
:** This is not settable via the DB properties. To set READ_COMMITTED_SNAPSHOT, there must be no active connections to the database except for the connection executing the ALTER command. If you are viewing the DB in the Server Management Studio, disconnect from any servers in the "Object Explorer" (right-click > Disconnect), then create a "New Query" and run the ALTER command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx for details.<br />
:** If your DB name starts with a number, you may need to put quotes around the DB name in the query.<br />
<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Microsoft Drivers for SQL Server for PHP ==<br />
<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
When using [[IIS]] it is strongly recommended to use the official Microsoft PHP installer from http://php.iis.net/, it should include the latest version of necessary drivers and it also simplifies future upgrades and configuration.<br />
<br />
For Windows servers with [[Apache]] see http://www.microsoft.com/en-us/download/details.aspx?id=20098.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.4.x (vc9) || Yes || 0.82 + 20110906 patches || [http://inethub.olvi.net.ua/ftp/pub/soft/programming/php/ms%20sql%20driver%20for%20%20php%205.4.10/dblib_ts.zip Download!] [ftp://inethub.olvi.net.ua/pub/soft/programming/php/ms%20sql%20driver%20for%20%20php%205.4.10/DBLIB_TS.zip FTP Download!] [http://www.sendspace.com/file/vtger3 Mirror]<br />
|-<br />
| No || 0.82 + 20110906 patches || [http://inethub.olvi.net.ua/ftp/pub/soft/programming/php/ms%20sql%20driver%20for%20%20php%205.4.10/dblib_nts.zip Download!] [ftp://inethub.olvi.net.ua/pub/soft/programming/php/ms%20sql%20driver%20for%20%20php%205.4.10/DBLIB_NTS.zip FTP Download!] [http://www.sendspace.com/file/nkg2j4 Mirror]<br />
|-<br />
| rowspan="2" | PHP 5.5.x (vc11) || Yes || 0.91.89 || [https://moodle.org/pluginfile.php/133/mod_forum/attachment/1012945/FreeTDS_0.91.89_PHP_5.5.x_%28vc11_ts_dblib%29.zip Download!]<br />
|-<br />
| No || 0.91.89 || [https://moodle.org/pluginfile.php/133/mod_forum/attachment/1012945/FreeTDS_0.91.89_PHP_5.5.x_%28vc11_nts_dblib%29.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to [[User:Alastair Hole|Alastair Hole]] for providing the PHP 5.3 builds of the libraries. Thanks to Enyby by providing the PHP 5.4 builds of the libraries. Thanks to David Aylmer for providing the PHP 5.5 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*make sure the SQL Server Browser service is running SQL Server 2005 Network Configuration -> SQL Server Services<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* FreeTDS for Windows is obsolete and too slow as of 2011. See: [http://moodle.org/mod/forum/discuss.php?d=183987 Hardware and Performance Forum]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Installing Postgres for PHP]]<br />
* [[Using the Microsoft SQL Server Driver for PHP]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:XMLDB]]<br />
[[Category:DB]]<br />
[[Category:SQL databases]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_Oracle_for_PHP&diff=96902
Installing Oracle for PHP
2012-04-12T14:21:04Z
<p>Stronk7: clarified the statement_cache_size setting a bit, only needed for testing</p>
<hr />
<div>* http://www.oracle.com/technetwork/articles/technote-php-instant-084410.html<br />
* http://moodle.org/mod/forum/discuss.php?d=65488#p308002 (with attached html document)<br />
* http://es.php.net/oci8<br />
<br />
<br />
== Broken versions of OCI8 driver ==<br />
<br />
PHP v5.2.4 (and perhaps v5.2.3 as well) have shipped with a bug in the OCI8 driver that leaks statement handles. The version of the OCI8 driver with the bug is v1.2.4. Possible workarounds:<br />
<br />
* Upgrade to PHP v5.2.5 or later<br />
* Downgrade to PHP v5.2.1 (reported to work)<br />
* Downgrade only the oci8 driver to the one included in PHP 5.2.1 (it worked for us -- iarenaza)<br />
* If you are on linux and/or can compile PECL extensions, install an older OCI8 driver (v1.2.3 seems to work) from the PECL repository http://pecl.php.net/package/oci8<br />
<br />
More information at<br />
* http://bugs.php.net/bug.php?id=42496 -- tracking the PHP OCI8 bug<br />
* http://tracker.moodle.org/browse/MDL-11429 -- diagnostics on the Moodle side<br />
<br />
== Installing Moodle on Windows with Oracle Express Edition ==<br />
<br />
=== Introduction ===<br />
This section explains how to install Moodle with Oracle Express Edition on Windows. I'm using it for '''debugging''' purpose. It's definitively not a production environment. The goal is to setup easily and quickly a Moodle/Windows/Oracle environment.<br />
<br />
=== Install Oracle ===<br />
# Download Oracle Express Edition on [http://www.oracle.com/technology/products/database/xe/index.html Oracle web site].<br />
# You will also need the Instant client [http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html from here] (free account sign up needed). Copy everything from the unzipped folder into apache/bin.<br />
# Install both.<br /><br />
# Access to the oracle console at http://127.0.0.1:8080/apex (Login=SYS Password=the_one_you_entered_during_the_installation).<br />
# Create a new user and give it all rights (including DBA).<br />
# Go to the SQL Commands page and grant your new user the dmbs_lock permission...<code sql><br />
grant execute on dbms_lock to XXXXX;<br />
</code>...where XXXXX is the username of your new user.<br />
# Log out and log in as the new user.<br />
# Run the script found in the Moodle codebase at /lib/dml/oci_native_moodle_package.sql. If you can not run this script directly, you can run its parts (separated by slashes) independently via the SQL Commands page.<br />
<br />
Note: Oracle Express Edition 10g is limited at one database called 'XE'.<br />
<br />
=== Set up your Oracle extension ===<br />
<br />
This document does not explain how to setup apache/php for Oracle. You can have more information on [http://www.oracle.com/technology/tech/php/htdocs/php-oracle-tutorial.html Oracle Documentation].<br />
<br />
Edit your phi.ini file, uncomment (remove the leading semicolon) the php_oci8 extension. In a WAMP setup, this is listed as...<br />
<br />
<code><br />
extension=php_oci8.dll<br />
</code><br />
<br />
Also, if you are going to use the installation for development/testing purposes, uncomment the following line and set the value to zero. It's not needed for normal operations (it causes a BIG slowdown of the system!).<br />
<br />
<code><br />
oci8.statement_cache_size = 0<br />
</code><br />
<br />
You may also need to uncomment php_oracle, php_pdo_oci, php_pdo_oci8 in some set-ups.<br />
<br />
=== Install Moodle ===<br />
On the database setup page:<br /><br />
Driver: Oracle oci8 (in the config file it should read "oci8po" for a 1.9.x install and "oci" for a 2.0.x install)<br /><br />
Host: empty the field<br /><br />
Database: //localhost:1521/XE<br /><br />
User: the user that you created<br /><br />
Password: the password you gave to the user<br /><br />
<br />
=== Configure Apache ===<br />
<br />
If you're running Moodle on Oracle with Apache on Linux, you might have issues with PHP being able to see the system environment variables. To resolve this, you can edit /etc/sysconfig/apache2 and add the following lines to the bottom:<br /><br />
<br /><br />
LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2# Set LANG Variables for UTF-8<br /><br />
NLS_LANG=AMERICAN_AMERICA.AL32UTF8<br /><br />
LANG=en_US.UTF-8<br /><br />
LC_ALL=en_US.UTF-8<br /><br />
LC_COLLATE=en_US.UTF-8<br /><br />
LC_CTYPE=en_US.UTF-8<br /><br />
LC_MESSAGES=en_US.UTF-8<br /><br />
LC_MONETARY=en_US.UTF-8<br /><br />
LC_NUMERIC=en_US.UTF-8<br /><br />
LC_TIME=en_US.UTF-8<br /><br />
NLS_NUMERIC_CHARACTERS='.,'<br /><br />
<br />
export LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIM NLS_LANG LD_LIBRARY_PATH NLS_NUMERIC_CHARACTERS<br /><br />
<br /><br />
Also need to add those two lines to ~/.bashrc so that the PHP command-line client can see it too. <br /><br />
<br /><br />
<br />
== Related links ==<br />
* [http://lewiscarr.co.uk/node/4 Installing ORACLE drivers with PHP]<br />
*[[Installing MSSQL for PHP]]<br />
*[[PHP]]<br />
*[http://moodle.org/mod/forum/discuss.php?d=134729#p588963 Can i install Moodle with Oracle database]<br />
*[http://moodle.org/mod/forum/discuss.php?d=65488 Who uses Oracle]<br />
*[https://docs.moodle.org/en/Step-by-step_Install_Guide_for_Solaris_10_with_Oracle_10 Step by step Install Guide for Solaris 10 with Oracle 10]<br />
*[http://learningischange.com/2009/05/29/install-moodle-on-an-oracle-database-in-25-minutes-or-less/ Install Moodle on an Oracle Database (in 25 minutes or less)]. The related Using Moodle forum discussion is [http://moodle.org/mod/forum/discuss.php?d=124629 here].<br />
*[http://www.mguhlin.org/2009/05/moodle-on-oracle-database.html Moodle on Oracle Database] discussion on Miguel Guhlin's blog <br />
<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]<br />
[[Category:SQL databases]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=94639
Installing MSSQL for PHP
2011-12-21T16:00:45Z
<p>Stronk7: /* Installation overview */</p>
<hr />
<div>== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.x only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - To set READ_COMMITTED_SNAPSHOT ON (or OFF), there must be no active connections to the database except for the connection executing the ALTER DATABASE command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*make sure the SQL Server Browser service is running SQL Server 2005 Network Configuration -> SQL Server Services<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* FreeTDS for Windows is obsolete and too slow as of 2011. See: [http://moodle.org/mod/forum/discuss.php?d=183987 Hardware and Performance Forum]<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Postgres for PHP]]<br />
* [[Using the Microsoft SQL Server Driver for PHP]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]<br />
[[Category:SQL databases]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=You_Might_Be_a_Moodler&diff=91232
You Might Be a Moodler
2011-10-05T11:06:45Z
<p>Stronk7: hehehe, happened here!</p>
<hr />
<div>In the spirit of Jeff Foxworthy's ''You Might be a Redneck'' - http://www.jefffoxworthy.com/comedy/jod/index.shtml <br />
<br />
*If you have ever turned on a football game and and the orange uniforms of one team caused you to leap up from the sofa and check out moodle.org, you might be a Moodler.<br />
<br />
*If you type "moodle.org" in your browser when you intend to type "google.com."<br />
<br />
*If you look up recipes in moodle.org.<br />
<br />
*If you look up recipes in moodle.org... and [http://moodle.org/mod/forum/discuss.php?d=5395&parent=30227 find them]!<br />
<br />
*If you can spell '''Dougiamas''' without having to look it up.<br />
<br />
*If you can ''pronounce'' '''Dougiamas''' without having to look it up.<br />
<br />
*If you check the Moodle forums at 8:30 on a Saturday night.<br />
<br />
*If you find yourself heading to the bugtracker when the dishwasher is broken.<br />
<br />
*If you start seeing double square brackets around words you don't know the translation of.<br />
<br />
*If your neighbours wonder why you named your cats Helen and Howard.<br />
<br />
*Your spouse wants you to take up golf again because they hate being a 'moodle widow(er)' more.<br />
<br />
*You describe the color of something as "Moodle" orange.<br />
<br />
*If you find yourself logging in to moodle.org during your summer holiday in Italy instead of enjoying the beautiful view or going to the beach. (Hi from Italy, Sigi)<br />
<br />
*If you come all the way from Germany to the US during your summer holiday and in addition to visiting lots of places you must absolutely go to a small town in South Carolina to find out about the latest Moodle tricks<br />
<br />
*You try to figure out how to grade e-mails from your friends without a drop down box<br />
<br />
*You find moodle.org is down for some reason and the first thing you want to do is post on moodle.org about it.<br />
<br />
*Every verb you use is 'to moodle'.<br />
<br />
*You go into a Chinese restaurant and ask for a side order of Moodles with your Egg Foo Young.<br />
<br />
*You talk about Moodle so much that your non-Moodling, non-native English speaking husband asks if the noodles on the plate in front of him are moodles and when you ask him if that is what he meant to say he replies, "Yes, aren't they moodles?" (based on a true story)<br />
<br />
*You know that the course id for '''Using Moodle''' is 5.<br />
<br />
*And even if you drive a car, you always drive it in '''5'''th gear.<br />
<br />
*You throw away all but the orange M&amp;M's.<br />
<br />
*You eat all but the orange M&amp;M's (and keep it for good ''feng shui'' in your desktop).<br />
<br />
*You try to convince your wife and kids that there is a Disney Park in Perth.<br />
<br />
*The homepage of your computer is http://www.moodle.org.<br />
<br />
*The homepage of every computer you have ever laid hands on is http://www.moodle.org.<br />
<br />
*You only recently discovered that typing an address in your browser takes you to a page outside Moodle.org<br />
<br />
*You sometimes refer to your third child as '''1.3'''<br />
<br />
*Your default response to a rerun on TV is to fire up the laptop and check out moodle.org.<br />
<br />
*If you put little labels on your TV's remote control that say... view.php?id=1, view.php?id=2, etc ...<br />
<br />
*You have five browser windows open right now, four of which are Moodle sites.<br />
<br />
*Reading the moodle.org forums is part of the morning routine: coffee, newspaper, wake up the children. . .<br />
<br />
*You find yourself adding items to a list that only the Moodle clique will understand.<br />
<br />
*You tell people to "Keep Moodling" and that they have been "Moodlised"<br />
<br />
*If instead of saying ''Have a good day'' you begin greeting folks by saying ''Happy Moodling!'' and even worse when you actually believe that the two statements mean the same thing. {Based on a true story}<br />
<br />
*If normal words start being morphed into ''Moodle-isms''. For example, when someone asks ''How are you?'' you begin to reply with words like Moodle-rrific and Moodle-tastic. Subsequently, you get confused when someone gives you a quizzical look because they do not understand what have just said. {Based on a true story}<br />
<br />
*If your students start showing up to the Friday night football games wanting to know when the Moodle chant is going to begin and students begin painting ''MOODLE'' on their chests! {Based on a true story}<br />
<br />
*You get custom plates for your new car... [http://moodle.org/mod/forum/discuss.php?d=54899 Moodle Plate]<br />
<br />
*You get a quote on a custom paint job for your new car [http://classroomrevolution.com/jeff/moodleorange.jpg Moodle Orange Car]<br />
<br />
* You are looking forward to Christmas vacation so that you will have time to upgrade Moodle!<br />
<br />
* You read something interesting and your first thought is, "I have to post that at moodle.org."<br />
<br />
* You forget that the comment you just ignored from a co-worker won't be retrievable later in a Recent Activities block.<br />
<br />
* When in the supermarket, you prefer to buy orange capsicums (peppers) rather than any other colour.<br />
<br />
* If you go to http://moodle.org instead of http://google.com and try some (global) searches there, only realizing after some attempts that you are looking within Moodleland only. {Based on a true story}</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_Oracle_for_PHP&diff=89962
Installing Oracle for PHP
2011-09-20T08:25:46Z
<p>Stronk7: </p>
<hr />
<div>* http://www.oracle.com/technetwork/articles/technote-php-instant-084410.html<br />
* http://moodle.org/mod/forum/discuss.php?d=65488#p308002 (with attached html document)<br />
* http://es.php.net/oci8<br />
<br />
----<br />
<br />
'''Important Note:''' Don't forget to enable this variable in your php.ini (or .htaccess) file:<br />
<br />
(else, all your data will be escaped following MySQL rules, that are incorrect for Oracle)<br />
<br />
magic_quotes_sybase = On<br />
<br />
<br />
== Broken versions of OCI8 driver ==<br />
<br />
PHP v5.2.4 (and perhaps v5.2.3 as well) have shipped with a bug in the OCI8 driver that leaks statement handles. The version of the OCI8 driver with the bug is v1.2.4. Possible workarounds:<br />
<br />
* Upgrade to PHP v5.2.5 or later<br />
* Downgrade to PHP v5.2.1 (reported to work)<br />
* Downgrade only the oci8 driver to the one included in PHP 5.2.1 (it worked for us -- iarenaza)<br />
* If you are on linux and/or can compile PECL extensions, install an older OCI8 driver (v1.2.3 seems to work) from the PECL repository http://pecl.php.net/package/oci8<br />
<br />
More information at<br />
* http://bugs.php.net/bug.php?id=42496 -- tracking the PHP OCI8 bug<br />
* http://tracker.moodle.org/browse/MDL-11429 -- diagnostics on the Moodle side<br />
<br />
== Installing Moodle on Windows with Oracle Express Edition ==<br />
<br />
=== Introduction ===<br />
This section explains how to install Moodle with Oracle Express Edition on Windows. I'm using it for '''debugging''' purpose. It's definitively not a production environment. The goal is to setup easily and quickly a Moodle/Windows/Oracle environment.<br />
<br />
=== Install Oracle ===<br />
Download Oracle Express Edition on [http://www.oracle.com/technology/products/database/xe/index.html Oracle web site].<br /><br />
You will also need the Instant client [http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html from here] (free account sign up needed). Copy everything from the unzipped folder into apache/bin. <br /><br />
Install both.<br /><br />
Access to the oracle console (http://127.0.0.1:8080/apex). Login: SYS Password: the_one_you_entered_during_the_installation<br /><br />
Create a new user and give it all rights (including DBA).<br /><br />
Note: Oracle Express Edition 10g is limited at one database called 'XE'.<br />
<br />
=== Set up your oracle extension ===<br />
This document does not explain how to setup apache/php for Oracle. You can have more information on [http://www.oracle.com/technology/tech/php/htdocs/php-oracle-tutorial.html Oracle Documentation]. On my own machine I used my WAMP installation ([http://www.en.wampserver.com/ Wampserver 2.0]) which allowed me to activate all oracle extensions in few clicks (php_oci8, php_oracle, php_pdo_oci, php_pdo_oci8).<br />
<br />
=== Install Moodle ===<br />
On the database setup page:<br /><br />
Driver: Oracle oci8 (in the config file it should read "oci8po" for a 1.9.x install and "oci" for a 2.0.x install)<br /><br />
Host: empty the field<br /><br />
Database: //localhost:1521/XE<br /><br />
User: the user that you created<br /><br />
Password: the password you gave to the user<br /><br />
<br />
=== Configure Apache ===<br />
If you're running Moodle on Oracle with Apache on Linux, you might have issues with PHP being able to see the system environment variables. To resolve this, you can edit /etc/sysconfig/apache2 and add the following lines to the bottom:<br /><br />
<br /><br />
LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2# Set LANG Variables for UTF-8<br /><br />
NLS_LANG=AMERICAN_AMERICA.AL32UTF8<br /><br />
LANG=en_US.UTF-8<br /><br />
LC_ALL=en_US.UTF-8<br /><br />
LC_COLLATE=en_US.UTF-8<br /><br />
LC_CTYPE=en_US.UTF-8<br /><br />
LC_MESSAGES=en_US.UTF-8<br /><br />
LC_MONETARY=en_US.UTF-8<br /><br />
LC_NUMERIC=en_US.UTF-8<br /><br />
LC_TIME=en_US.UTF-8<br /><br />
export LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIM NLS_LANG LD_LIBRARY_PATH<br /><br />
<br /><br />
Also need to add those two lines to ~/.bashrc so that the PHP command-line client can see it too. <br /><br />
<br /><br />
<br />
== Related links ==<br />
* [http://lewiscarr.co.uk/node/4 Installing ORACLE drivers with PHP]<br />
*[[Installing MSSQL for PHP]]<br />
*[[PHP]]<br />
*[http://moodle.org/mod/forum/discuss.php?d=134729#p588963 Can i install Moodle with Oracle database]<br />
*[http://moodle.org/mod/forum/discuss.php?d=65488 Who uses Oracle]<br />
*[https://docs.moodle.org/en/Step-by-step_Install_Guide_for_Solaris_10_with_Oracle_10 Step by step Install Guide for Solaris 10 with Oracle 10]<br />
*[http://learningischange.com/2009/05/29/install-moodle-on-an-oracle-database-in-25-minutes-or-less/ Install Moodle on an Oracle Database (in 25 minutes or less)]. The related Using Moodle forum discussion is [http://moodle.org/mod/forum/discuss.php?d=124629 here].<br />
*[http://www.mguhlin.org/2009/05/moodle-on-oracle-database.html Moodle on Oracle Database] discussion on Miguel Guhlin's blog <br />
<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]<br />
[[Category:SQL databases]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=89961
Installing MSSQL for PHP
2011-09-20T08:25:29Z
<p>Stronk7: </p>
<hr />
<div>== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - To set READ_COMMITTED_SNAPSHOT ON (or OFF), there must be no active connections to the database except for the connection executing the ALTER DATABASE command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Postgres for PHP]]<br />
* [[Using the Microsoft SQL Server Driver for PHP]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]<br />
[[Category:SQL databases]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Using_the_Microsoft_SQL_Server_Driver_for_PHP&diff=89957
Using the Microsoft SQL Server Driver for PHP
2011-09-20T08:23:21Z
<p>Stronk7: </p>
<hr />
<div>{{Moodle 2.0}}<br />
== Using the SQL Server Driver for PHP from Microsoft ==<br />
<br />
== Introduction ==<br />
This short manual is for running Moodle 2.0 (and upwards) using the Microsoft SQL Server (MSSQL) RDBMS. The steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
First of all, the minimum required version of MSSQL has been stabilized to MSSQL 2005 (v.9).<br />
<br />
== Installation overview ==<br />
1. Install Microsoft SQL Server including SQL Server Management Studio. ([http://www.microsoft.com/sql/editions/express/default.mspx A free version, SQL Server Express Edition] is available for testing.)<br />
:Make sure to choose mixed authentication (Windows and local accounts) to keep things simpler later. Define the "sa" account password when requested (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Configure Windows for MSSQL.<br />
:By default, MSSQL listens to port 1433 for incoming TCP/IP connections and this port needs to be opened in the firewall. This is explicitly configured in the firewall installed (either Windows Firewall in the Control Panel or the configuration interface for other firewalls). If the port was changed when MSSQL was installed, then specify the correct port number to open in the firewall.<br />
:Confirm the TCP/IP protocol is enabled in: '''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Create and configure a new database.<br />
:Open "SQL Server Management Studio" and create a new empty database.<br />
*Execute the following command to enable Row Versioning:<br />
<br />
<code><br />
USE MASTER<br />
GO<br />
ALTER DATABASE &lt;your-database-name&gt; SET READ_COMMITTED_SNAPSHOT ON<br />
GO<br />
</code><br />
<br />
4. Install PHP and a web server.<br />
*PHP can be downloaded from [http://www.php.net/downloads.php www.php.net]<br />
*If IIS is used as the web server, IIS 7.0 or later is recommended with [http://www.iis.net/download FastCGI and WinCache]. <br />
<br />
5. Install the SQL Server Driver for PHP.<br />
:On the web server, install [http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9 SQL Server Driver for PHP] (minimum version required is v1.1) including all the pre-requisites listed on the download page. Note: it is critical to install the SQL Server Native Access Client version documented on the download page of the SQL Server Driver for PHP.<br />
:Configure PHP to use the appropriate SQLSRV driver. In php.ini, set the following:<br />
<br />
For PHP 5.2.4 (or later)<br />
<br />
<code><br />
[PHP_SQLSRV]<br />
extension=php_sqlsrv_52_nts_vc9.dll<br />
</code><br />
<br />
For PHP 5.3.2 (or later)<br />
<br />
<code><br />
[PHP_SQLSRV]<br />
extension=php_sqlsrv_53_nts_vc9.dll<br />
</code><br />
<br />
The Microsoft documentation for the SQL Server Driver for PHP is available at: http://msdn.microsoft.com/en-us/library/ee229548(v=SQL.10).aspx <br />
<br />
6. Install and configure Moodle.<br />
:Continue with the [[Installing Moodle|standard Moodle installation]].<br />
<br />
7. The Moodle '''config.php''' should include lines like these:<br />
<code php><br />
$CFG->dbtype = 'sqlsrv'; // Required<br />
$CFG->dbhost = 'localhost'; // Assuming that MSSQL is on the same server, otherwise <br />
// use the actual name or IP address of your database server<br />
$CFG->dbname = 'moodle'; // The name of the newly created Moodle database<br />
$CFG->dbuser = 'yourusername'; // Usually the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = true;<br />
$CFG->prefix = 'mdl_'; // The prefix can be changed per individual preferences, <br />
// but NEVER leave this blank!<br />
</code><br />
<br />
:If the config.php file doesn't exist, it will be generated as normal from the Moodle installer. Alternatively, use the config-dist.php file that comes with the Moodle package to create a custom config.php file.<br />
<br />
8. Restart or start your web server.<br />
:If Moodle still cannot communicate with the database server, turn '''display_startup_errors''' to "On" in the /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
9. Test the database connection.<br />
:Try this PHP script, just add a text file called test.php from the example below and change ('localhost', 'db_user', 'db_password') to align with the config.php settings, and load from local host (http://localhost/test.php).<br />
<br />
<code php><br />
<?php<br />
$link = sqlsrv_connect($this->dbhost, array('UID' => 'db_user', 'PWD' => 'db_password'));<br />
if($link === FALSE) {<br />
echo 'Could not connect';<br />
die('Could not connect: ' . sqlsrv_errors(SQLSRV_ERR_ALL));<br />
}<br />
echo 'Successful connection';<br />
sqlsrv_close($link);<br />
?><br />
</code><br />
<br />
10. Complete the rest of the Moodle installation as usual.<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Postgres for PHP]]<br />
* [[Installing MSSQL for PHP]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=89956
Installing MSSQL for PHP
2011-09-20T08:22:08Z
<p>Stronk7: /* See Also */</p>
<hr />
<div>== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - To set READ_COMMITTED_SNAPSHOT ON (or OFF), there must be no active connections to the database except for the connection executing the ALTER DATABASE command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Postgres for PHP]]<br />
* [[Using the Microsoft SQL Server Driver for PHP]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Using_the_Microsoft_SQL_Server_Driver_for_PHP&diff=89953
Using the Microsoft SQL Server Driver for PHP
2011-09-20T08:19:07Z
<p>Stronk7: /* See Also */</p>
<hr />
<div>{{Moodle 2.0}}<br />
== Using the SQL Server Driver for PHP from Microsoft ==<br />
<br />
== Introduction ==<br />
This short manual is for running Moodle 2.0 (and upwards) using the Microsoft SQL Server (MSSQL) RDBMS. The steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
First of all, the minimum required version of MSSQL has been stabilized to MSSQL 2005 (v.9).<br />
<br />
== Installation overview ==<br />
1. Install Microsoft SQL Server including SQL Server Management Studio. ([http://www.microsoft.com/sql/editions/express/default.mspx A free version, SQL Server Express Edition] is available for testing.)<br />
:Make sure to choose mixed authentication (Windows and local accounts) to keep things simpler later. Define the "sa" account password when requested (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Configure Windows for MSSQL.<br />
:By default, MSSQL listens to port 1433 for incoming TCP/IP connections and this port needs to be opened in the firewall. This is explicitly configured in the firewall installed (either Windows Firewall in the Control Panel or the configuration interface for other firewalls). If the port was changed when MSSQL was installed, then specify the correct port number to open in the firewall.<br />
:Confirm the TCP/IP protocol is enabled in: '''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Create and configure a new database.<br />
:Open "SQL Server Management Studio" and create a new empty database.<br />
*Execute the following command to enable Row Versioning:<br />
<br />
<code><br />
USE MASTER<br />
GO<br />
ALTER DATABASE &lt;your-database-name&gt; SET READ_COMMITTED_SNAPSHOT ON<br />
GO<br />
</code><br />
<br />
4. Install PHP and a web server.<br />
*PHP can be downloaded from [http://www.php.net/downloads.php www.php.net]<br />
*If IIS is used as the web server, IIS 7.0 or later is recommended with [http://www.iis.net/download FastCGI and WinCache]. <br />
<br />
5. Install the SQL Server Driver for PHP.<br />
:On the web server, install [http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9 SQL Server Driver for PHP] (minimum version required is v1.1) including all the pre-requisites listed on the download page. Note: it is critical to install the SQL Server Native Access Client version documented on the download page of the SQL Server Driver for PHP.<br />
:Configure PHP to use the appropriate SQLSRV driver. In php.ini, set the following:<br />
<br />
For PHP 5.2.4 (or later)<br />
<br />
<code><br />
[PHP_SQLSRV]<br />
extension=php_sqlsrv_52_nts_vc9.dll<br />
</code><br />
<br />
For PHP 5.3.2 (or later)<br />
<br />
<code><br />
[PHP_SQLSRV]<br />
extension=php_sqlsrv_53_nts_vc9.dll<br />
</code><br />
<br />
The Microsoft documentation for the SQL Server Driver for PHP is available at: http://msdn.microsoft.com/en-us/library/ee229548(v=SQL.10).aspx <br />
<br />
6. Install and configure Moodle.<br />
:Continue with the [[Installing Moodle|standard Moodle installation]].<br />
<br />
7. The Moodle '''config.php''' should include lines like these:<br />
<code php><br />
$CFG->dbtype = 'sqlsrv'; // Required<br />
$CFG->dbhost = 'localhost'; // Assuming that MSSQL is on the same server, otherwise <br />
// use the actual name or IP address of your database server<br />
$CFG->dbname = 'moodle'; // The name of the newly created Moodle database<br />
$CFG->dbuser = 'yourusername'; // Usually the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = true;<br />
$CFG->prefix = 'mdl_'; // The prefix can be changed per individual preferences, <br />
// but NEVER leave this blank!<br />
</code><br />
<br />
:If the config.php file doesn't exist, it will be generated as normal from the Moodle installer. Alternatively, use the config-dist.php file that comes with the Moodle package to create a custom config.php file.<br />
<br />
8. Restart or start your web server.<br />
:If Moodle still cannot communicate with the database server, turn '''display_startup_errors''' to "On" in the /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
9. Test the database connection.<br />
:Try this PHP script, just add a text file called test.php from the example below and change ('localhost', 'db_user', 'db_password') to align with the config.php settings, and load from local host (http://localhost/test.php).<br />
<br />
<code php><br />
<?php<br />
$link = sqlsrv_connect($this->dbhost, array('UID' => 'db_user', 'PWD' => 'db_password'));<br />
if($link === FALSE) {<br />
echo 'Could not connect';<br />
die('Could not connect: ' . sqlsrv_errors(SQLSRV_ERR_ALL));<br />
}<br />
echo 'Successful connection';<br />
sqlsrv_close($link);<br />
?><br />
</code><br />
<br />
10. Complete the rest of the Moodle installation as usual.<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Oracle for PHP]]<br />
* [[Installing MSSQL for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=89952
Installing MSSQL for PHP
2011-09-20T08:18:36Z
<p>Stronk7: /* See Also */</p>
<hr />
<div>== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - To set READ_COMMITTED_SNAPSHOT ON (or OFF), there must be no active connections to the database except for the connection executing the ALTER DATABASE command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Oracle for PHP]]<br />
* [[Using the Microsoft SQL Server Driver for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=89951
Installing MSSQL for PHP
2011-09-20T08:17:38Z
<p>Stronk7: deleting info not needed in 2.x anymore</p>
<hr />
<div>== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - To set READ_COMMITTED_SNAPSHOT ON (or OFF), there must be no active connections to the database except for the connection executing the ALTER DATABASE command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=89949
Installing MSSQL for PHP
2011-09-20T08:12:37Z
<p>Stronk7: Taking rid of ODBTP / ODBC alternatives. Although may work, we don't play with them anymore.</p>
<hr />
<div>== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - To set READ_COMMITTED_SNAPSHOT ON (or OFF), there must be no active connections to the database except for the connection executing the ALTER DATABASE command. See http://msdn.microsoft.com/en-us/library/bb522682.aspx<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
:Also, don't forget to set one of the following '''alternatives''', in order to get all the data properly "slashed":<br />
:* magic_quotes_gpc = Off '''or'''<br />
:* magic_quotes_gpc = On '''and''' magic_quotes_sybase = On <br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu]. Do note that [http://www.freetds.org/news.html freeTDS] 0.91 was recently released, you can find latest versions [http://freetds.sourceforge.net/ here]. <br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Moodle_version_history&diff=83314
Moodle version history
2011-05-06T17:26:14Z
<p>Stronk7: /* Moodle 2.0 */</p>
<hr />
<div>==Moodle 1.0==<br />
*Moodle 1.0 - 20 August 2002<br />
*Moodle 1.0.1 - 26 August 2002<br />
*Moodle 1.0.2 - 2 September 2002<br />
*Moodle 1.0.3 - 5 September 2002<br />
*Moodle 1.0.4 - 10 September 2002<br />
*Moodle 1.0.5 - 27 September 2002<br />
*Moodle 1.0.6 - 26 October 2002<br />
:: 1.0.6.1 - 6 Nov<br />
:: 1.0.6.2 - 11 Nov<br />
:: 1.0.6.3 - 14 Nov<br />
:: 1.0.6.4 - 25 Nov<br />
*Moodle 1.0.7 - 9 December 2002<br />
*Moodle 1.0.8 - 7 January 2003<br />
*Moodle 1.0.9 - 30 May 2003<br />
<br />
==Moodle 1.1==<br />
*Moodle 1.1 - 29 August 2003<br />
*Moodle 1.1.1 - 11 September 2003<br />
<br />
==Moodle 1.2==<br />
*Moodle 1.2 - 20 March 2004<br />
*Moodle 1.2.1 - 25 March 2004<br />
<br />
==Moodle 1.3==<br />
*Moodle 1.3 - 25 May 2004<br />
*Moodle 1.3.1 - 4 June 2004<br />
*Moodle 1.3.2 - 9 July 2004<br />
*Moodle 1.3.3 - 16 July 2004<br />
*Moodle 1.3.4 - 11 August 2004<br />
<br />
==Moodle 1.4==<br />
*Moodle 1.4 - 31 August 2004<br />
*Moodle 1.4.1 - 12 September 2004<br />
*Moodle 1.4.2 - 5 November 2004<br />
*Moodle 1.4.3 - 21 December 2004<br />
*Moodle 1.4.4 - 7 March 2005 <br />
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005<br />
<br />
==Moodle 1.5==<br />
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005<br />
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005<br />
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005<br />
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005<br />
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006<br />
<br />
==Moodle 1.6==<br />
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006<br />
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006<br />
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006<br />
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006<br />
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007<br />
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007<br />
*Moodle 1.6.6 - 11 January 2008<br />
*Moodle 1.6.7 - 11 July 2008<br />
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008<br />
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009<br />
<br />
==Moodle 1.7==<br />
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006<br />
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007<br />
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007<br />
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007<br />
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008<br />
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008<br />
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008<br />
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009<br />
<br />
==Moodle 1.8==<br />
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007<br />
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007<br />
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007<br />
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007<br />
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008<br />
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008<br />
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008<br />
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008<br />
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009<br />
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009<br />
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009<br />
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009<br />
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010<br />
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010<br />
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010<br />
<br />
==Moodle 1.9==<br />
*[[Moodle 1.9 release notes|Moodle 1.9]] - 3 March 2008<br />
*[[Moodle 1.9.1 release notes|Moodle 1.9.1]] - 15 May 2008<br />
*[[Moodle 1.9.2 release notes|Moodle 1.9.2]] - 11 July 2008<br />
*[[Moodle 1.9.3 release notes|Moodle 1.9.3]] - 15 October 2008<br />
*[[Moodle 1.9.4 release notes|Moodle 1.9.4]] - 28 January 2009<br />
*[[Moodle 1.9.5 release notes|Moodle 1.9.5]] - 13 May 2009<br />
*[[Moodle 1.9.6 release notes|Moodle 1.9.6]] - 21 October 2009<br />
*[[Moodle 1.9.7 release notes|Moodle 1.9.7]] - 25 November 2009<br />
*[[Moodle 1.9.8 release notes|Moodle 1.9.8]] - 25 March 2010<br />
*[[Moodle 1.9.9 release notes|Moodle 1.9.9]] - 8 June 2010<br />
*[[Moodle 1.9.10 release notes|Moodle 1.9.10]] - 25 October 2010<br />
*[[Moodle 1.9.11 release notes|Moodle 1.9.11]] - 21 February 2011<br />
<br />
==Moodle 2.0==<br />
*[[Moodle 2.0 release notes|Moodle 2.0]] - 24 November 2010<br />
*[[Moodle 2.0.1 release notes|Moodle 2.0.1]] - 25 December 2010<br />
*[[Moodle 2.0.2 release notes|Moodle 2.0.2]] - 21 February 2011<br />
*[[Moodle 2.0.3 release notes|Moodle 2.0.3]] - 5 May 2011<br />
<br />
[[Category:Release notes]]<br />
<br />
[[fr:Historique des versions]]<br />
[[es:Historia de las versiones]]<br />
[[de:Versionshistorie]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Latest_release_notes&diff=83313
Latest release notes
2011-05-06T17:25:32Z
<p>Stronk7: </p>
<hr />
<div>==Moodle 2.0.3==<br />
{{:Moodle 2.0.3 release notes}}<br />
<br />
==Moodle 1.9.11==<br />
{{:Moodle 1.9.11 release notes}}<br />
<br />
==Moodle 1.8.14==<br />
<br />
{{:Moodle 1.8.14 release notes}}<br />
<br />
==Moodle 1.7.7==<br />
{{:Moodle 1.7.7 release notes}}<br />
<br />
==Moodle 1.6.9==<br />
{{:Moodle 1.6.9 release notes}}<br />
<br />
== See also ==<br />
<br />
* [[Moodle version history]] for dates of release and links to notes for earlier versions<br />
* [[Updates]]<br />
<br />
[[Category:Release notes]]<br />
<br />
[[es:Notas de versiones]]<br />
[[fr:Dernières notes de mise à jour]]<br />
[[pt:Versões do Moodle]]<br />
[[ru:Примечания к версиям]]<br />
[[de:Aktuellste Versionsinformationen]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Release_process&diff=83304
Development:Release process
2011-05-06T14:19:39Z
<p>Stronk7: /* For a stable release on an existing branch XX with point value Y */</p>
<hr />
<div>This page describes the standard procedures for making Moodle releases.<br />
<br />
===For a stable release on an existing branch XX with point value Y===<br />
<br />
One week before:<br />
# Notify Moodle developers and Moodle Partners about the upcoming release<br />
# Freeze stable development and post in the [http://moodle.org/mod/forum/view.php?id=55 General developer forum] to inform everyone of the freeze<br />
# Review and complete the [[:Category:Release notes|release notes]] of the upcoming version.<br />
# [[Development:Weekly Code Review|Test / QA]] etc<br />
<br />
Release day: (exactly before the next integration cycle begins on Monday)<br />
# Make sure all the Unit tests pass!<br />
# Edit version.php, update name and version to new point release and commit in the integration repository<br />
# Run the [https://github.com/skodak/mdlrelease/blob/master/weeklybuild.txt mdlrelease] process, that will do, for a release:<br />
#* Tag the integration repository with a tag name vX.Y.Z using "MOODLE_XXY" as a tag message <br />
#* push change to main git repo, github and Gitorious<br />
#* sync CVS mirror (copy the version.php file and update githash.php to point to the release commit)<br />
#* '''cvs tag -FR MOODLE_XXY''' to tag everything in the release<br />
#* '''cvs tag -FR MOODLE_XX_WEEKLY''' to make the weekly version match the release<br />
# '''cvs -q update -dP''' all code on download server<br />
# Run moodle-makenightlystableXX<br />
# Go to download/stableXX <br />
# Copy current daily as release package:<br />
## '''cp moodle-latest-XX.zip moodle-X.X.Y.zip'''<br />
## '''cp moodle-latest-XX.tgz moodle-X.X.Y.tgz'''<br />
# Edit download index.php page with new release info and links<br />
# Run moodle-makewindowspackages so all the windows packages will be rebuilt<br />
# Edit download windows/index.php page with new release info (always keeping the "+")<br />
# Visit releases page on tracker and make the release, bumping all remaining open bugs to the next point release. This must be done both for the [http://tracker.moodle.org/secure/project/ViewProject.jspa?pid=10011 Moodle Project] and the [http://tracker.moodle.org/secure/project/ViewProject.jspa?pid=10033 Non-core contributed modules project].<br />
# Add the release date to the [[:Category:Release notes|release notes]]<br />
# Update the [[Latest release notes]] page<br />
# Add the new version to the [[Moodle version history]] page<br />
# Include the new versions in [[Moodle 1.8 release notes]], [[Moodle 1.9 release notes]] and [[Moodle 2.0 release notes]]<br />
# Notify all registered sys admins<br />
# Create a new ('''blocker serious security issue!''') META bug in the Tracker "META: Moodle XX.Y+1 and friends security bugs" to associate new/pending security bugs that will be fixed in the next release as subtasks. An example is MDL-20840 (for Moodle 1.9.7).<br />
# Create a new ('''blocker serious security issue!''') task in the Tracker "Prepare security advisories for XX.Y+1 and friends" to define/edit/polish the security advisories in the next release. Link it with the previous one as "will be resolved by". An example is MDL-20722 (for Moodle 1.9.7).<br />
<br />
One week later:<br />
# Update the version.php in git to be X.X.Y+ during the next weekly PULL process<br />
# Add all security advisories to [http://moodle.org/security Security news]<br />
# Add all security issues to the [[:Category:Release notes|release notes]] with links to security advisories<br />
# Update the Latest Release block on [http://moodle.org/news/ Moodle.org news]<br />
# Post about the release in the [http://moodle.org/news/ moodle.org news]<br />
# Create a new release notes page for the next version XX.Y+1 (here you can find [[Development:Release notes template|one template for that]])<br />
<br />
==See also==<br />
<br />
* [[Development:Stable branch support]]<br />
* [[Development:Major release process]]<br />
* MDLSITE-699: How to repackage one weekly at any moment (a.k.a. "emergency weekly").<br />
<br />
[[Category:Processes|Release process]]<br />
[[Category:Release notes|Release process]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Release_process&diff=83291
Development:Release process
2011-05-06T13:09:46Z
<p>Stronk7: Clarifying git tagging</p>
<hr />
<div>This page describes the standard procedures for making Moodle releases.<br />
<br />
===For a stable release on an existing branch XX with point value Y===<br />
<br />
One week before:<br />
# Notify Moodle developers and Moodle Partners about the upcoming release<br />
# Freeze stable development and post in the [http://moodle.org/mod/forum/view.php?id=55 General developer forum] to inform everyone of the freeze<br />
# Review and complete the [[:Category:Release notes|release notes]] of the upcoming version.<br />
# [[Development:Weekly Code Review|Test / QA]] etc<br />
<br />
Release day: (exactly before the next integration cycle begins on Monday)<br />
# Make sure all the Unit tests pass!<br />
# Edit version.php, update name and version to new point release and commit in the integration repository<br />
# Tag the integration repository with a tag name vX.Y.Z using "MOODLE_XXY" as a tag message<br />
# push change to main git repo, github and Gitorious<br />
# sync CVS mirror (copy the version.php file and update githash.php to point to the release commit)<br />
# '''cvs tag -FR MOODLE_XXY''' to tag everything in the release<br />
# '''cvs tag -FR vX.X.Y''' to tag everything in the release<br />
# '''cvs tag -FR MOODLE_XX_WEEKLY''' to make the weekly version match the release<br />
# '''cvs -q update -dP''' all code on download server<br />
# Run moodle-makenightlystableXX<br />
# Go to download/stableXX <br />
# Copy current daily as release package:<br />
## '''cp moodle-latest-XX.zip moodle-X.X.Y.zip'''<br />
## '''cp moodle-latest-XX.tgz moodle-X.X.Y.tgz'''<br />
# Edit download index.php page with new release info and links<br />
# Run moodle-makewindowspackages so all the windows packages will be rebuilt<br />
# Edit download windows/index.php page with new release info (always keeping the "+")<br />
# Visit releases page on tracker and make the release, bumping all remaining open bugs to the next point release. This must be done both for the [http://tracker.moodle.org/secure/project/ViewProject.jspa?pid=10011 Moodle Project] and the [http://tracker.moodle.org/secure/project/ViewProject.jspa?pid=10033 Non-core contributed modules project].<br />
# Add the release date to the [[:Category:Release notes|release notes]]<br />
# Update the [[Latest release notes]] page<br />
# Add the new version to the [[Moodle version history]] page<br />
# Include the new versions in [[Moodle 1.8 release notes]], [[Moodle 1.9 release notes]] and [[Moodle 2.0 release notes]]<br />
# Notify all registered sys admins<br />
# Create a new ('''blocker serious security issue!''') META bug in the Tracker "META: Moodle XX.Y+1 and friends security bugs" to associate new/pending security bugs that will be fixed in the next release as subtasks. An example is MDL-20840 (for Moodle 1.9.7).<br />
# Create a new ('''blocker serious security issue!''') task in the Tracker "Prepare security advisories for XX.Y+1 and friends" to define/edit/polish the security advisories in the next release. Link it with the previous one as "will be resolved by". An example is MDL-20722 (for Moodle 1.9.7).<br />
<br />
One week later:<br />
# Update the version.php in git to be X.X.Y+ during the next weekly PULL process<br />
# Add all security advisories to [http://moodle.org/security Security news]<br />
# Add all security issues to the [[:Category:Release notes|release notes]] with links to security advisories<br />
# Update the Latest Release block on [http://moodle.org/news/ Moodle.org news]<br />
# Post about the release in the [http://moodle.org/news/ moodle.org news]<br />
# Create a new release notes page for the next version XX.Y+1 (here you can find [[Development:Release notes template|one template for that]])<br />
<br />
==See also==<br />
<br />
* [[Development:Stable branch support]]<br />
* [[Development:Major release process]]<br />
* MDLSITE-699: How to repackage one weekly at any moment (a.k.a. "emergency weekly").<br />
<br />
[[Category:Processes|Release process]]<br />
[[Category:Release notes|Release process]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:DML_functions&diff=83277
Development:DML functions
2011-05-05T22:37:55Z
<p>Stronk7: fixing get_recordset use</p>
<hr />
<div>{{Moodle_2.0}}This page describes the functions available to access data in the Moodle database. You should '''exclusively''' use these functions in order to retrieve or modify database content because these functions provide a high level of abstraction and guarantee that your database manipulation will work against different RDBMSes.<br />
<br />
Where possible, tricks and examples will be documented here in order to make developers' lives a bit easier. Of course, feel free to clarify, complete and add more information to this documentation. It will be welcome, absolutely!<br />
<br />
== Main info ==<br />
<br />
'''Important note:''' All the functions shown on this page are for use in '''Moodle 2.0 upwards''', where we changed the [[Development:DB layer 2.0|DB layer]] to support some new features. If you need information for previous Moodle version, take a look to the [[Development:DML functions - pre 2.0|DML functions - pre 2.0]] page. For a detailed reference of changes, see the [[Development:DB layer 2.0 migration docs|migration docs]].<br />
<br />
* All the function calls on this page are public methods of the $DB global object, so you'll need to "import" it within your functions (not needed in global scripts) with one simple:<br />
<code php>global $DB;</code><br />
* All the $table parameters in the functions are meant to be the table name ''without'' prefixes.<br />
<code php>$user = $DB->get_record('user', array('id'=>'1');</code><br />
* When using the xxx_sql() functions, table names must be enclosed between curly braces.<br />
<code php>$user = $DB->get_record_sql('SELECT * FROM {user} WHERE id = ?', array(1));</code><br />
* All the $conditions parameters in the functions are arrays of fieldname=>fieldvalue elements.<br />
<code php>$user = $DB->get_record('user', array('firstname'=>'Martin', 'lastname'=>'Dougiamas'));</code><br />
* All the $params parameters in the functions are arrays of values used to fill placeholders in SQL statements. Both the question mark and named placeholders can be used. Note that named params '''must be unique''' even if the value passed is the same.<br />
<code php><br />
/// Question mark placeholders:<br />
$DB->get_record_sql('SELECT * FROM {user} WHERE firstname = ? AND lastname = ?', <br />
array('Martin', 'Dougiamas'));<br />
<br />
/// Named placeholders:<br />
$DB->get_record_sql('SELECT * FROM {user} WHERE firstname = :firstname AND lastname = :lastname',<br />
array('firstname'=>'Martin', 'lastname'=>'Dougiamas'));<br />
</code><br />
<br />
== The functions ==<br />
<br />
===Seeing how many records match a given criteria===<br />
<code php><br />
o $DB->count_records($table, array $conditions=null) <br />
/// Count the records in a table where all the given conditions met.<br />
o $DB->count_records_select($table, $select, array $params=null, $countitem="COUNT('x')") <br />
/// Count the records in a table which match a particular WHERE clause.<br />
o $DB->count_records_sql($sql, array $params=null) <br />
/// Get the result of a SQL SELECT COUNT(...) query.<br />
</code><br />
<br />
===Seeing if one record exists===<br />
<code php><br />
o $DB->record_exists($table, array $conditions=null) <br />
/// Test whether a record exists in a table where all the given conditions met.<br />
o $DB->record_exists_select($table, $select, array $params=null) <br />
/// Test whether any records exists in a table which match a particular WHERE clause.<br />
o $DB->record_exists_sql($sql, array $params=null) <br />
/// Test whether a SQL SELECT statement returns any records.<br />
</code><br />
<br />
===Getting a single record===<br />
<br />
<code php><br />
o $DB->get_record($table, array $conditions, $fields='*', $ignoremultiple=false) <br />
/// Get a single database record as an object where all the given conditions met.<br />
o $DB->get_record_select($table, $select, array $params=null, $fields='*', $ignoremultiple=false)<br />
/// Get a single database record as an object which match a particular WHERE clause.<br />
o $DB->get_record_sql($sql, array $params=null)<br />
/// Get a single database record as an object using a SQL statement.<br />
</code><br />
<br />
===Getting an array of records===<br />
Each of the following methods return an array of objects. The array is indexed by the first column of the fields returned by the query. Thus to assure consistent data, it appears to be best practice to ensure that your query include an "id column" as the first field. (When developing custom tables, be sure to make id your first column for this reason!)<br />
<code php><br />
o $DB->get_records($table, array $conditions=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0) <br />
/// Get a number of records as an array of objects where all the given conditions met.<br />
o $DB->get_records_select($table, $select, array $params=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0) <br />
/// Get a number of records as an array of objects which match a particular WHERE clause.<br />
o $DB->get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)<br />
/// Get a number of records as an array of objects using a SQL statement.<br />
o $DB->get_records_list($table, $field, array $values, $sort='', $fields='*', $limitfrom='', $limitnum='') <br />
/// Get a number of records as an array of objects where one field match one list of values.<br />
</code><br />
<br />
The following methods return data as key/value pairs in an associative array.<br />
<code php><br />
o $DB->get_records_menu($table, array $conditions=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0) <br />
/// Get the first two columns from a number of records as an associative array where all the given conditions met.<br />
o $DB->get_records_select_menu($table, $select, array $params=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0)<br />
/// Get the first two columns from a number of records as an associative array which match a particular WHERE clause.<br />
o $DB->get_records_sql_menu($sql, array $params=null, $limitfrom=0, $limitnum=0)<br />
/// Get the first two columns from a number of records as an associative array using a SQL statement.<br />
</code><br />
====Examples====<br />
=====moodle_database::get_records()=====<br />
Get a number of records as an array of objects where all the given conditions met.<br />
<code php><br />
///Get all records where foo = bar<br />
$result = $DB->get_records($table,array('foo'=>'bar'));<br />
<br />
///Get all records where foo = bar and jon = doe<br />
$result = $DB->get_records($table,array('foo' => 'bar AND' , 'jon' => 'doe'));<br />
<br />
///Get all records where foo = bar, but only return the fields foo,bar,jon,doe<br />
$result = $DB->get_records($table,array('foo'=>'bar'),null,'foo,bar,jon,doe');<br />
///The previous example would cause data issues unless the 'foo' field happens to have unique values.<br />
</code><br />
<br />
=====moodle_database::get_records_select()=====<br />
Get a number of records as an array of objects which match a particular WHERE clause.<br />
<code php><br />
///Get all records where jon = 'doe' and bob is not = 'tom'<br />
///The 'select' parameter is (if not empty) is dropped directly into the WHERE clause without alteration.<br />
$table = 'foo';<br />
$select = 'jon = 'doe' AND bob != "tom" '; //is put into the where clause<br />
$result = $DB->get_records_select($table,$select);<br />
</code><br />
<br />
=====moodle_database::get_records_sql()=====<br />
Get a number of records as an array of objects using a SQL statement. Defined as an abstract function in moodle_database, this method is implemented per database type.<br />
<code php><br />
///Get all records from 'table' where foo = bar<br />
$result = $DB->get_records('SELECT * FROM table WHERE foo = ?',array('bar');<br />
<br />
///Get all records from 'table' where foo = 'bar' and bob = 'tom'<br />
///This is somewhat similar to how Drupal makes its queries<br />
$result = $DB->get_records('SELECT * FROM table WHERE foo = ? AND bob = ?', array( 'bar' , 'tom' );<br />
</code><br />
<br />
=====moodle_database::get_records_list()=====<br />
Get a number of records as an array of objects where one field match one list of values.<br />
<code php><br />
///Get all records where the values('bar',1,'elephant','moodle') are found in the field 'foo'<br />
$result = $DB->get_records($table, 'foo', array( 'bar', 1, 'elephant', 'moodle'));<br />
<br />
///Get all records where the values('bar',1,'elephant','moodle') are found in the field 'foo'<br />
///Only returning the fields 'id', 'test' and 'taco'<br />
$result = $DB->get_records($table, 'foo', array( 'bar', 1, 'elephant', 'moodle')null, 'id,test,taco');<br />
</code><br />
<br />
=====moodle_database::get_records_menu()=====<br />
Get the first two columns from a number of records as an associative array where all the given conditions met. <br />
You can choose the two fields or leave the parameter blank and the method will return the first two columns of the table.<br />
Returns an associative array. <br />
<code php><br />
///Get all records from table 'foo' where column 'foo' is equal to the value 'bar'<br />
$table = 'foo'; ///name of table<br />
$conditions = array('foo'=>'bar'); ///the name of the field (key) and the desired value<br />
<br />
$result = $DB->get_records_menu($table,$conditions));<br />
<br />
///Get all records from table 'foo' where column 'foo' is equal to the value 'bar'<br />
///Returning the values from the columns 'id' and 'tacos'<br />
$table = 'foo'; ///name of table<br />
$conditions = array('foo'=>'bar'); ///the name of the field (key) and the desired value<br />
$fields = 'id, tacos'; ///list of fields to return<br />
<br />
$result = $DB->get_records_menu($table,$conditions));<br />
<br />
</code><br />
The result of this last example will look something like:<br />
<code php><br />
/// The value of the id field is 909 and the value of the 'tacos' column is 6<br />
array(1) { [909]=6 }<br />
</code><br />
<br />
=====moodle_database::get_records_select_menu()=====<br />
Get the first two columns from a number of records as an associative array which match a particular WHERE clause.<br />
<code php><br />
///Get all records where jon = 'doe' and bob is not = 'tom'<br />
///The 'select' parameter is (if not empty) is dropped directly into the WHERE clause without alteration.<br />
$table = 'foo';<br />
$select = 'jon = "doe" AND bob != "tom" '; //is put into the where clause<br />
$result = $DB->get_records_select_menu($table,$select);<br />
<br />
$table = 'foo';<br />
$select = 'jon = "doe" AND bob != "tom" '; //is put into the where clause<br />
$fields = 'id, tacos';//return these fields<br />
$result = $DB->get_records_select_menu($table,$select,null,$fields);<br />
</code><br />
<br />
The result of this last example will look something like:<br />
<code php><br />
/// The value of the id field is 909 and the value of the 'tacos' column is 6<br />
array(1) { [909]=6 }<br />
</code><br />
<br />
=====moodle_database::get_records_sql_menu()=====<br />
Get the first two columns from a number of records as an associative array using a SQL statement.<br />
<code php><br />
///Get all records from table foo where bar = 6<br />
$sql = 'SELECT * FROM foo WHERE bar = ?';<br />
$params = array(6);<br />
<br />
$result = $DB->get_records_sql_menu($sql,$params);<br />
<br />
///Get all records from table foo where bar = 6<br />
$sql = 'SELECT id,tacos FROM foo WHERE bar = ?';<br />
$params = array(6);<br />
<br />
$result = $DB->get_records_sql_menu($sql,$params);<br />
<br />
<br />
</code><br />
<br />
The result of this last example will look something like:<br />
<code php><br />
/// The value of the id field is 909 and the value of the 'tacos' column is 6<br />
array(1) { [909]=6 } <br />
</code><br />
<br />
===Getting a particular field value from one record===<br />
<code php><br />
o $DB->get_field($table, $return, array $conditions)<br />
/// Get a single field value from a table record where all the given conditions met.<br />
o $DB->get_field_select($table, $return, $select, array $params=null)<br />
/// Get a single field value from a table record which match a particular WHERE clause.<br />
o $DB->get_field_sql($sql, array $params=null)<br />
/// Get a single field value (first field) using a SQL statement.<br />
</code><br />
<br />
===Getting a particular field value from various records===<br />
<br />
<code php><br />
o $DB->get_fieldset_select($table, $return, $select, array $params=null)<br />
/// Selects records and return values of chosen field as an array which match a particular WHERE clause.<br />
o $DB->get_fieldset_sql($sql, array $params=null)<br />
/// Selects records and return values (first field) as an array using a SQL statement.<br />
</code><br />
<br />
===Setting a particular field in the database===<br />
<code php><br />
o $DB->set_field($table, $newfield, $newvalue, array $conditions=null)<br />
/// Set a single field in every table record where all the given conditions met.<br />
o $DB->set_field_select($table, $newfield, $newvalue, $select, array $params=null)<br />
/// Set a single field in every table record which match a particular WHERE clause.<br />
</code><br />
<br />
===Deleting Records===<br />
<code php><br />
o $DB->delete_records($table, array $conditions=null) <br />
/// Delete the records from a table where all the given conditions met.<br />
o $DB->delete_records_select($table, $select, array $params=null)<br />
/// Delete one or more records from a table which match a particular WHERE clause.<br />
</code><br />
<br />
===Inserting Records===<br />
The method to insert records is called aptly enough, insert_record(). The method accepts 4 parameters, but the fourth, "bulk", in most implementations is unused.<br />
<code php><br />
o $DB->insert_record($table, $dataobject, $returnid=true, $bulk=false) <br />
/// Insert a record into a table and return the "id" field if required.<br />
</code><br />
====Example(s)====<br />
<code php><br />
$record = new stdClass();<br />
$record->name = 'overview';<br />
$record->displayorder = '10000';<br />
$DB->insert_record('quiz_report', $record, false);<br />
</code><br />
<br />
<code php><br />
$record = new stdClass();<br />
$record->name = 'overview';<br />
$record->displayorder = '10000';<br />
$lastinsertid = $DB->insert_record('quiz_report', $record);<br />
</code><br />
<br />
===Updating Records===<br />
<code php><br />
o $DB->update_record($table, $dataobject, $bulk=false)<br />
/// Update a record in a table.<br />
</code><br />
<br />
===Using Recordsets===<br />
<br />
Where the number of records to be retrieved from DB is high, the '''get_records_xxx()''' functions above are far from optimal, because they load all the records in memory at the same time. Under those circumstances, it is highly recommended to use these '''get_recordset_xxx()''' functions instead, which use one nice mechanism to iterate over all the target records and save a lot of memory.<br />
<br />
Only one thing is '''absolutely important''': Don't forget to close the recordsets after using them! (This will free up a lot of resources in the RDBMS).<br />
<br />
Here is the general way to iterate over records using the '''get_recordset_xxx()''' functions:<br />
<br />
<code php><br />
$rs = $DB->get_recordset(....) {<br />
foreach ($rs as $record) {<br />
// Do whatever you want with this record<br />
}<br />
$rs->close(); // Don't forget to close the recordset!<br />
</code><br />
<br />
And this is the list of available functions (100% paired with the get_records_xxx() above):<br />
<code php><br />
o $DB->get_recordset($table, array $conditions=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0) <br />
/// Get a number of records as a moodle_recordset where all the given conditions met.<br />
o $DB->get_recordset_select($table, $select, array $params=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0) <br />
/// Get a number of records as a moodle_recordset which match a particular WHERE clause.<br />
o $DB->get_recordset_sql($sql, array $params=null, $limitfrom=0, $limitnum=0);<br />
/// Get a number of records as a moodle_recordset using a SQL statement.<br />
<br />
o $DB->get_recordset_list($table, $field='', $values='', $sort='', $fields='*', $limitfrom='', $limitnum='') <br />
/// Get a number of records as a moodle_recordset where one field matches one list of values.<br />
</code><br />
<br />
===Delegated transactions===<br />
<br />
* Please note some databases do not support transactions (such as the MyISAM MySQL database engine), however all server administrators are strongly encouraged to migrate to databases that support transactions (such as the InnoDB MySQL database engine).<br />
* Previous versions supported only one level of transaction. Since Moodle 2.0, the DML layer emulates delegated transactions that allow nesting of transactions.<br />
* Transactions should not be used much in Moodle core; they are intended for various plugins such as web services, enrol and auth plugins.<br />
* Some subsystems (such as messaging) do not support transactions because is it is not possible to rollback in external systems.<br />
<br />
A transaction is started by:<br />
<code php><br />
$transaction = $DB->start_delegated_transaction();<br />
</code><br />
<br />
and finished by:<br />
<code php><br />
$transaction->allow_commit();<br />
</code><br />
<br />
Usually a transaction is rolled back when an exception is thrown. <code>$transaction->rollback($ex);</code> must be used very carefully because it might break compatibility with databases that do not support transactions. Transactions cannot be used as part of expected code flow; they can be used only as an emergency protection of data consistency.<br />
<br />
See more details in [[Development:DB layer 2.0 delegated transactions]] or MDL-20625.<br />
<br />
====Example(s)====<br />
<br />
<code php><br />
global $DB;<br />
try {<br />
$transaction = $DB->start_delegated_transaction();<br />
// Insert a record<br />
$DB->insert('foo', $object);<br />
$DB->insert('bar', $otherobject);<br />
<br />
// Assuming the both inserts work, we get to the following line.<br />
$transaction->allow_commit();<br />
} catch(Exception $e) {<br />
$transaction->rollback($e);<br />
}<br />
</code><br />
<br />
===Helper Functions===<br />
<br />
In order have real cross-db compatibility, there are some helper functions used to build SQL fragments based on the DB Moodle is running. Using them we'll avoid conditional queries here and there and have those "incompatibilities" fixed once and for ever.<br />
<code php><br />
o $DB->sql_bitand($int1, $int2) <br />
/// Returns the SQL text to be used in order to perform one bitwise AND <br />
/// operation between 2 integers.<br />
o $DB->sql_bitnot($int1) <br />
/// Returns the SQL text to be used in order to perform one bitwise NOT <br />
/// operation with 1 integer.<br />
o $DB->sql_bitor($int1, $int2)<br />
/// Returns the SQL text to be used in order to perform one bitwise OR <br />
/// operation between 2 integers.<br />
o $DB->sql_bitxor($int1, $int2) <br />
/// Returns the SQL text to be used in order to perform one bitwise XOR <br />
/// operation between 2 integers.<br />
<br />
o $DB->sql_null_from_clause()<br />
/// Returns the FROM clause required by some DBs in all SELECT statements.<br />
<br />
o $DB->sql_ceil($fieldname)<br />
/// Returns the correct CEIL expression applied to fieldname.<br />
o $DB->sql_ilike()<br />
/// Returns the proper SQL to do LIKE in a case-insensitive way.<br />
o $DB->sql_length($fieldname)<br />
/// Returns the SQL text to be used to calculate the length in characters of one expression.<br />
o $DB->sql_modulo($int1, $int2)<br />
/// Returns the SQL text to be used in order to calculate module - remainder after division<br />
o $DB->sql_position($needle, $haystack)<br />
/// Returns the SQL for returning searching one string for the location of another.<br />
/// Note: If using placeholders BOTH in $needle and $haystack, they MUST be named placeholders.<br />
o $DB->sql_substr($expr, $start, $length=false)<br />
/// Returns the proper substr() SQL text used to extract substrings from DB.<br />
/// Note: This fuction has changed in Moodle 2.0 and now at least 2 params are mandatory.<br />
/// Note: Now it returns the whole SQL text to be used instead of only the function name.<br />
<br />
o $DB->sql_cast_char2int($fieldname, $text=false)<br />
/// Returns the SQL to be used in order to CAST one CHAR column to INTEGER.<br />
o $DB->sql_cast_char2real($fieldname, $text=false)<br />
/// Returns the SQL to be used in order to CAST one CHAR column to REAL number.<br />
<br />
o $DB->sql_compare_text($fieldname, $numchars=32) <br />
/// Returns the SQL text to be used to compare one TEXT (clob) column.<br />
/// with one VARCHAR column.<br />
o $DB->sql_order_by_text($fieldname, $numchars=32)<br />
/// Returns the SQL text to be used to order by one TEXT (clob) column.<br />
<br />
o $DB->sql_concat()<br />
/// Returns the proper SQL to do CONCAT between the elements passed.<br />
o $DB->sql_concat_join($separator="' '", $elements=array())<br />
/// Returns the proper SQL to do CONCAT between the elements passed using one separator.<br />
o $DB->sql_fullname($first='firstname', $last='lastname')<br />
/// Returns the proper SQL to concatenate $firstname and $lastname.<br />
<br />
o $DB->sql_isempty($tablename, $fieldname, $nullablefield, $textfield)<br />
/// Returns the proper SQL to know if one field is empty.<br />
o $DB->sql_isnotempty($tablename, $fieldname, $nullablefield, $textfield)<br />
/// Returns the proper SQL to know if one field is not empty.<br />
o $DB->sql_empty()<br />
/// Returns the empty string char used by every supported DB.<br />
</code><br />
<br />
==See also==<br />
<br />
* [[Development:DML exceptions|DML exceptions]]: New DML code is throwing exceptions instead of returning false if anything goes wrong<br />
* [[Development:DML drivers|DML drivers]]: Database drivers for new DML layer<br />
* [[Development:DML functions - pre 2.0|DML functions - pre 2.0]]: '''(deprecated!)''' For information valid before Moodle 2.0.<br />
* [[Development:DDL functions|DDL functions]]: Where all the functions used to handle DB objects ([[wikipedia:Data_Definition_Language|DDL]]) are defined.<br />
* [[Development:DB layer 2.0 examples|DB layer 2.0 examples]]: To see some code examples using various DML functions.<br />
* [[Development:DB layer 2.0 migration docs|DB layer 2.0 migration docs]]: Information about how to modify your code to work with the new Moodle 2.0 DB layer.<br />
* [[Development:DTL functions|DTL functions]]: Exporting, importing and moving of data stored in SQL databases<br />
<br />
[[Category:DB]]<br />
[[Category:XMLDB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83109
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T22:54:40Z
<p>Stronk7: </p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark (20110428) ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.<br />
<br />
----<br />
<br />
From the review, points 01-19 must be analyzed, discussed and implemented, specially the ones detected as blockers for the consecution of the targets above. The ones not being considered blockers can be left for later, once the "basic" (1st) target has been fulfilled. The review page will show which ones are considered blockers and where (MDL-xxxx) their implementation is going to happen.<br />
<br />
----<br />
<br />
Immediate plan, something like:<br />
* you take a look to those points and add any objection / comment / missing point in the last section of the page.<br />
* I also take a look to the thing and start implementing some stuff, like the start/end dispatchers and some tests to have them under control.<br />
* Next day, availability of parties determined, we share thoughts.<br />
* Next-next day, we start "doing" things :-)<br />
<br />
=== Feedback from Mark regarding review ===<br />
<br />
==== Related to integration with restore_controller & general behavior ====<br />
<br />
* R0401: I see what you are trying to get at here, but seems like over architecting IMO. For example, you have something that goes from FOO > BAR > MOODLE2 (CONVERTPATH1) and then you have something that goes to FOO > MOODLE2 (CONVERTPATH2) both installed, then your proposal would be necessary. Though, why would you have both installed? CONVERTPATH2 would replace CONVERTPATH1 making CONVERTPATH1 obsolete and never used anyways. Anyways, I'd say let's hold this off as a fun project after everything else is done.<br />
:Eloy: The problem with current implementation is that, right now, nothing guarantees [[Development:Backup 2.0 multiple formats|multiple formats]] to be supported, so if we want to have (real example) IMSCC => BCK19 => BCK20 current stuff can / cannot work, it depends exclusively on the order returned by convert_factory::converters(). And that doesn't seem to be reliable at all. That's the reason for suggesting some simple "best path" implementation (Dijkstra or similar), just to keep out the "random factor" above. Also, note that, in the future, we can also create converters which origin is, exactly, moodle2, and the target can be IMSCC / BCK19 / WHATEVER (aka exporters), so potentially we could provide automatic conversion between any of them transparently. Say, convert one BCK19 package into one IMSCC or whatever. Just a matter of using the corresponding (best) path.<br />
* R0402: I don't see much of an advantage here as by moving to static you then loose access to all of your instance variables and methods. Cost of creating a new instance shouldn't be that terrible. If this is required, fine, let's do it.<br />
:Eloy: Surely it's not important now, as far as current converter (moodle1) have nothing important on its constructor. And we have not hundreds of converters. But anything can grow and seems like a logic requirement to avoid instantiation of non-used stuff.<br />
** As for checking the environment, I think that can be done in can_convert right? Part of figuring out if it can handle the conversion.<br />
:Eloy: But what if one converter needs to create one webservice request over, say, SOAP before performing the conversion, or requires SSL... and the server does not fulfill those requirements. Once again static separated methods sound like the best solution.<br />
* R0403-5: These are fine. We should probably make our own converter_exceptions, what do you think?<br />
:Eloy: Yes. I think one abstract converter_exception (exactly like backup_exception) is ok, then each converter extends it. Also, the steps/tasks/plans need their exceptions, surely extending base_xxxx_exception<br />
<br />
==== Related to the converters/moodle1 infrastructure ====<br />
<br />
* R0408: There is execute_after_convert but really, that's called after the XML has been processed. Execution flow is kind of weird due to the processor. We could add another stage of processing, though I do think execution flow will greatly improve once start/end callbacks are being used.<br />
:Eloy: Agree, I think start/end dispatchers will alleviate a lot current after_execute() code. So perhaps we need to implement R0409 ASAP (priority1) and move stuff there to see how things improve.<br />
* R0410: I'm not sure what this is.<br />
:Eloy: I mean, right now, the get_deprecated/renamed/new() methods belong to the moodle1_structure_step. And that is ok as far as there aren't collisions (repeated tag names in the tree being processed by the step). What if we have the "timemodified" tag, both in the forum and in the forum_post elements and we want them to be "renamed" diferently. That caused me to think that such transformations should be defined on each convert_path_element and not in the steps (to avoid those collisions). And then, the convert_data() method could be applied automatically, so the $data arriving to the convert_xxxx($data) methods could have all those transformations (and lowercase too) automatically performed. Just that.<br />
* Rest are fine.<br />
<br />
==== Related to coding in general ====<br />
<br />
* Sounds fine.</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83108
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T22:53:12Z
<p>Stronk7: /* Related to the converters/moodle1 infrastructure */</p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark (20110428) ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.<br />
<br />
----<br />
<br />
From the review, points 01-19 must be analyzed, discussed and implemented, specially the ones detected as blockers for the consecution of the targets above. The ones not being considered blockers can be left for later, once the "basic" (1st) target has been fulfilled. The review page will show which ones are considered blockers and where (MDL-xxxx) their implementation is going to happen.<br />
<br />
----<br />
<br />
Immediate plan, something like:<br />
* you take a look to those points and add any objection / comment / missing point in the last section of the page.<br />
* I also take a look to the thing and start implementing some stuff, like the start/end dispatchers and some tests to have them under control.<br />
* Next day, availability of parties determined, we share thoughts.<br />
* Next-next day, we start "doing" things :-)<br />
<br />
=== Feedback from Mark regarding review ===<br />
<br />
==== Related to integration with restore_controller & general behavior ====<br />
<br />
* R0401: I see what you are trying to get at here, but seems like over architecting IMO. For example, you have something that goes from FOO > BAR > MOODLE2 (CONVERTPATH1) and then you have something that goes to FOO > MOODLE2 (CONVERTPATH2) both installed, then your proposal would be necessary. Though, why would you have both installed? CONVERTPATH2 would replace CONVERTPATH1 making CONVERTPATH1 obsolete and never used anyways. Anyways, I'd say let's hold this off as a fun project after everything else is done.<br />
::The problem with current implementation is that, right now, nothing guarantees [[Development:Backup 2.0 multiple formats|multiple formats]] to be supported, so if we want to have (real example) IMSCC => BCK19 => BCK20 current stuff can / cannot work, it depends exclusively on the order returned by convert_factory::converters(). And that doesn't seem to be reliable at all. That's the reason for suggesting some simple "best path" implementation (Dijkstra or similar), just to keep out the "random factor" above. Also, note that, in the future, we can also create converters which origin is, exactly, moodle2, and the target can be IMSCC / BCK19 / WHATEVER (aka exporters), so potentially we could provide automatic conversion between any of them transparently. Say, convert one BCK19 package into one IMSCC or whatever. Just a matter of using the corresponding (best) path.<br />
* R0402: I don't see much of an advantage here as by moving to static you then loose access to all of your instance variables and methods. Cost of creating a new instance shouldn't be that terrible. If this is required, fine, let's do it.<br />
::Surely it's not important now, as far as current converter (moodle1) have nothing important on its constructor. And we have not hundreds of converters. But anything can grow and seems like a logic requirement to avoid instantiation of non-used stuff.<br />
** As for checking the environment, I think that can be done in can_convert right? Part of figuring out if it can handle the conversion.<br />
::But what if one converter needs to create one webservice request over, say, SOAP before performing the conversion, or requires SSL... and the server does not fulfill those requirements. Once again static separated methods sound like the best solution.<br />
* R0403-5: These are fine. We should probably make our own converter_exceptions, what do you think?<br />
:: Yes. I think one abstract converter_exception (exactly like backup_exception) is ok, then each converter extends it. Also, the steps/tasks/plans need their exceptions, surely extending base_xxxx_exception<br />
<br />
==== Related to the converters/moodle1 infrastructure ====<br />
<br />
* R0408: There is execute_after_convert but really, that's called after the XML has been processed. Execution flow is kind of weird due to the processor. We could add another stage of processing, though I do think execution flow will greatly improve once start/end callbacks are being used.<br />
::Agree, I think start/end dispatchers will alleviate a lot current after_execute() code. So perhaps we need to implement R0409 ASAP (priority1) and move stuff there to see how things improve.<br />
* R0410: I'm not sure what this is.<br />
::I mean, right now, the get_deprecated/renamed/new() methods belong to the moodle1_structure_step. And that is ok as far as there aren't collisions (repeated tag names in the tree being processed by the step). What if we have the "timemodified" tag, both in the forum and in the forum_post elements and we want them to be "renamed" diferently. That caused me to think that such transformations should be defined on each convert_path_element and not in the steps (to avoid those collisions). And then, the convert_data() method could be applied automatically, so the $data arriving to the convert_xxxx($data) methods could have all those transformations (and lowercase too) automatically performed. Just that.<br />
* Rest are fine.<br />
<br />
==== Related to coding in general ====<br />
<br />
* Sounds fine.</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83107
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T22:42:27Z
<p>Stronk7: /* Related to integration with restore_controller & general behavior */</p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark (20110428) ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.<br />
<br />
----<br />
<br />
From the review, points 01-19 must be analyzed, discussed and implemented, specially the ones detected as blockers for the consecution of the targets above. The ones not being considered blockers can be left for later, once the "basic" (1st) target has been fulfilled. The review page will show which ones are considered blockers and where (MDL-xxxx) their implementation is going to happen.<br />
<br />
----<br />
<br />
Immediate plan, something like:<br />
* you take a look to those points and add any objection / comment / missing point in the last section of the page.<br />
* I also take a look to the thing and start implementing some stuff, like the start/end dispatchers and some tests to have them under control.<br />
* Next day, availability of parties determined, we share thoughts.<br />
* Next-next day, we start "doing" things :-)<br />
<br />
=== Feedback from Mark regarding review ===<br />
<br />
==== Related to integration with restore_controller & general behavior ====<br />
<br />
* R0401: I see what you are trying to get at here, but seems like over architecting IMO. For example, you have something that goes from FOO > BAR > MOODLE2 (CONVERTPATH1) and then you have something that goes to FOO > MOODLE2 (CONVERTPATH2) both installed, then your proposal would be necessary. Though, why would you have both installed? CONVERTPATH2 would replace CONVERTPATH1 making CONVERTPATH1 obsolete and never used anyways. Anyways, I'd say let's hold this off as a fun project after everything else is done.<br />
::The problem with current implementation is that, right now, nothing guarantees [[Development:Backup 2.0 multiple formats|multiple formats]] to be supported, so if we want to have (real example) IMSCC => BCK19 => BCK20 current stuff can / cannot work, it depends exclusively on the order returned by convert_factory::converters(). And that doesn't seem to be reliable at all. That's the reason for suggesting some simple "best path" implementation (Dijkstra or similar), just to keep out the "random factor" above. Also, note that, in the future, we can also create converters which origin is, exactly, moodle2, and the target can be IMSCC / BCK19 / WHATEVER (aka exporters), so potentially we could provide automatic conversion between any of them transparently. Say, convert one BCK19 package into one IMSCC or whatever. Just a matter of using the corresponding (best) path.<br />
* R0402: I don't see much of an advantage here as by moving to static you then loose access to all of your instance variables and methods. Cost of creating a new instance shouldn't be that terrible. If this is required, fine, let's do it.<br />
::Surely it's not important now, as far as current converter (moodle1) have nothing important on its constructor. And we have not hundreds of converters. But anything can grow and seems like a logic requirement to avoid instantiation of non-used stuff.<br />
** As for checking the environment, I think that can be done in can_convert right? Part of figuring out if it can handle the conversion.<br />
::But what if one converter needs to create one webservice request over, say, SOAP before performing the conversion, or requires SSL... and the server does not fulfill those requirements. Once again static separated methods sound like the best solution.<br />
* R0403-5: These are fine. We should probably make our own converter_exceptions, what do you think?<br />
:: Yes. I think one abstract converter_exception (exactly like backup_exception) is ok, then each converter extends it. Also, the steps/tasks/plans need their exceptions, surely extending base_xxxx_exception<br />
<br />
==== Related to the converters/moodle1 infrastructure ====<br />
<br />
* R0408: There is execute_after_convert but really, that's called after the XML has been processed. Execution flow is kind of weird due to the processor. We could add another stage of processing, though I do think execution flow will greatly improve once start/end callbacks are being used.<br />
* R0410: I'm not sure what this is.<br />
* Rest are fine.<br />
<br />
<br />
==== Related to coding in general ====<br />
<br />
* Sounds fine.</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83095
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T18:52:46Z
<p>Stronk7: </p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark (20110428) ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.<br />
<br />
----<br />
<br />
From the review, points 01-19 must be analyzed, discussed and implemented, specially the ones detected as blockers for the consecution of the targets above. The ones not being considered blockers can be left for later, once the "basic" (1st) target has been fulfilled. The review page will show which ones are considered blockers and where (MDL-xxxx) their implementation is going to happen.<br />
<br />
----<br />
<br />
Immediate plan, something like:<br />
* you take a look to those points and add any objection / comment / missing point in the last section of the page.<br />
* I also take a look to the thing and start implementing some stuff, like the start/end dispatchers and some tests to have them under control.<br />
* Next day, availability of parties determined, we share thoughts.<br />
* Next-next day, we start "doing" things :-)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83094
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T18:40:24Z
<p>Stronk7: /* Ongoing discussion Eloy & Mark (20110428) */</p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark (20110428) ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.<br />
<br />
----<br />
<br />
From the review, points 01-19 must be analyzed, discussed and implemented, specially the ones detected as blockers for the consecution of the targets above. The ones not being considered blockers can be left for later, once the "basic" (1st) target has been fulfilled. The review page will show which ones are considered blockers and where (MDL-xxxx) their implementation is going to happen.</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83093
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T18:40:10Z
<p>Stronk7: </p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark (20110428) ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.<br />
<br />
From the review, points 01-19 must be analyzed, discussed and implemented, specially the ones detected as blockers for the consecution of the targets above. The ones not being considered blockers can be left for later, once the "basic" (1st) target has been fulfilled. The review page will show which ones are considered blockers and where (MDL-xxxx) their implementation is going to happen.</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=83092
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-28T18:36:45Z
<p>Stronk7: </p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)<br />
<br />
=== Ongoing discussion Eloy & Mark ===<br />
<br />
Three (3) targets are planned, no action on next target will be performed before completing the previous one:<br />
<br />
* The "basic" (1st): Be able to restore everything but user-related information.<br />
* The "desirable" (2nd): Be able to restore activity user-related information.<br />
* The "complete" (3rd): Rest of information.</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_-_Converters_review_2011-04&diff=83091
Development:Backup 2.0 - Converters review 2011-04
2011-04-28T18:22:24Z
<p>Stronk7: /* Related to pending & tricky areas */</p>
<hr />
<div>[[Development:Backup 2.0|Backup 2.0]] > [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x main page]] > Review 2011-04<br />
{{Template:Development:Backup 2.0}}{{Moodle_2.1}}<br />
<br />
This page summarizes the results of the review performed (on April 2011) over the code available at https://github.com/mrmark/moodle related to the implementation of a general solution for the creation and support of moodle restore converters and its first implementation as one Moodle 1.9 => 2.x converter.<br />
<br />
=== References ===<br />
<br />
* MDL-22414 - the main tracker issue for this task.<br />
* [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x article]] in Moodle Docs.<br />
* [http://tracker.moodle.org/secure/attachment/23241/Moodle1.9to2.0Restore.pdf PDF with initial implementation plan].<br />
* [https://github.com/mrmark/moodle/compare/master...converters_wip Development branch changes] <br />
<br />
=== Nomenclature ===<br />
<br />
* The review results are shown below as one list of numbered points, briefly explained, with link to corresponding MDL-xxxx (subtask of MDL-22414), where any discussion / agreement / coding should happen.<br />
* All the MDL-xxxx issue created will begin with R04xx to note they have been ignited as part of this review process and the point they correspond to.<br />
* Each point below includes one short "status" message in order to know the immediate actions that must be performed on it.<br />
* New points can be added to the review as long as discussion / agreement happens, if necessary.<br />
<br />
=== Global summary ===<br />
<br />
* Overall, all code seems to be in correct places and be correct code.<br />
* The main infrastructure parts (base/plan/moodle1 converters and plan/task/step architectures) are ok, though their APIs would need some improvements detailed below.<br />
* There are a lot of stuff missing / todo. Files, users, enrolments, plugins, tricky activities, comments, grades...<br />
* We need to push-push-push (4 weeks to freeze!).<br />
<br />
=== The list ===<br />
<br />
==== Related to integration with restore_controller & general behavior ====<br />
<br />
* R0401: status: to code. Right now, the to_moodle2_format() performs instantiation of all available converters + simple loop to get the conversions to perform. Instead, it should be possible to use exclusively static methods, returning origin format, target format and cost of the conversion, and then finding the best path or so. Note this is trivial right now but can be a useful general approach if new converters arrive (core and 3rd part).<br />
<br />
* R0402: status: to code. The can_convert() function can be static too, passing tempdir as param. Also, the same function (or another one, mandatory) should check if all the PHP/server requirements are satisfied or no (some converters can need extra stuff available in order to be able to perform conversions).<br />
<br />
* R0403: status: to discuss. After each conversion, the original source directory is deleted and replaced by the converted one. This makes things complex to trace or perform repeated conversions and also, doesn't observe the $CFG->keeptempdirectoriesonbackup completely. We should be able to keep temp stuff undeleted if desired and, perhaps too, be able to instruct the restore controller about tempdir changes.<br />
<br />
* R0404: status: to code. Exceptions: It needs to be decided if we are going to use own converter_exception/s or restore_exception/s and use them constantly along all the code base.<br />
<br />
* R0405: status: to code. Logging: Converters stuff must inherit / use restore_controller logging facilities.<br />
<br />
==== Related to the converters/moodle1 infrastructure ====<br />
<br />
* R0406: status: to discuss. All the parser / processor / path_elelement stuff is part of the abstract plan_converter. That stuff should be moved to moodle1_converter as far as it is highly dependent / tidied with the conversion particularities.<br />
<br />
* R0407: status: to discuss (not important). About converters, should class names and file names match, i.e. converter.class.php => moodle1_converter.class.php<br />
<br />
* R0408: status: to discuss. On restore, we have both after_restore() methods available in steps (executed when the step execution ends) and in tasks (executed when the whole plan execution ends). Do we need this duality in plan_converter, or is it enough with current one. Right now it seems that we are using a lot these methods to do the work, and process_xxx() should be used instead (together with next point).<br />
<br />
* R0409: status: to code. Since some weeks ago the notify_path_start/end() methods are available in the xml processor, should we start using them to call some stuff in converter, able to dispatch to start_xxxx() and end_xxxx() methods in the converter steps. It would help a lot with both starting/closing XML tags, creating and closing xml files, or any other pre/post stuff needing to be executed at certain stages.<br />
<br />
* R0410: status: to discuss. The deprecated/new/renamed elements / mutate_datum stuff. Perhaps it should be moved from steps to path_elements instead, so each path element autocontains the basic transformations to be performed on data and they are applied automatically. It seems a better place for that definitions. Or, alternatively, we'll need deprecated/new/renamed/mutate_xxxx() methods, one for each path.<br />
<br />
* R0411: status: to code. After looking current uses of the xml writer, it seems clear that we need some extra methods, able to print one tag completely, push/pop last open tag and other commodities in order to make coding easier.<br />
<br />
* R0412: status: to code. The "trick" in the parser about dynamically modify /MOD paths seems ok (I cannot imagine another way to implement it). Similar magic will be needed for blocks and surely, the start/end implementation above will need a similar way to handle/dispatch processing.<br />
<br />
* R0413: status: to code. Some raw accesses to the backup_ids_temp DB stuff must be modified to use helper functions. Also, the use of the table in get_context() can be really slow (text comparison). Look for some alternative.<br />
<br />
* R0414: status: to code. The convert_file() method uses the backup_ids_temp to get sequential fileid values. It should be enough (completely safe), to use one static (in memory) generator instead. No concurrence problems at all IMO.<br />
<br />
* R0415: status: to discuss. Support for plugins is a must as far as at least qtypes require it. Note that question types are going to suffer one major revamp on Moodle 2.1, so their final architecture is unknown right now (different from both 1.9 and 2.0).<br />
<br />
* R0416: status: to code (tiny detail). In current moodle1_conversion, original_site_identifier should be generated only if there is one original identifier. Right now it saves one "?" that can lead to wrong results detecting same sites.<br />
<br />
==== Related to coding in general ====<br />
<br />
* R0417: status: to code. Copyright messages are required on each new file. It must be the standard one with GPL3 msg and MR/Mark/whatever copyright.<br />
<br />
* R0418: status: to code. We should have as many tests as possible, specially testing all the infrastructure stuff, in order to guarantee it continues working as expected after any refactor / modification. Right now it's practically inexistent.<br />
<br />
* R0419: status: to do periodically. We need to keep the main repo for all the project "converters_wip" in sync (merged) with current moodle.git master branch in order to ensure stuff will land properly (conflicts-free) and converters will be able to use any new feature / improvement available.<br />
<br />
==== Related to pending & tricky areas ====<br />
<br />
* R0420: status: to code. There are a lot of areas which coding hasn't been ignited yet (surely to pending work in the list above, don't worry). Here there is a brief ordered list, annotating the ones that will be really tricky:<br />
** Users and enrollments: All the users with their complete information must be saved to new users.xml file and each process_xxx() method must, continuously, be annotating needed uses in order to generate proper inforef.xml files. Enrolments will be all moved to manual ones (this needs confirmation).<br />
** Workshop activity: Completely revamped in 2.0. It has proper subplugins. Upgrade code needs to be deeply analyzed and XML differences too to know how to implement it. (contact: David).<br />
** Wiki activity: Also brand new in 2.0. Upgrade needs analysis and XML differences too. (contact: Dongsheng).<br />
** Resource activity: Split into file/folder/page/url activities. The structure is simple (no user data) but the split makes it really tricky. Also very file-intensive. Upgrade code needs analysis and XML differences (contact: Petr).<br />
** Files: 1.9 files can had site/course files (apart from the ones "owned" by the module @ moddata). They must be annotated and moved to new files.xml & storage. There is some code already but is not used in the general converter helper stuff (should be moodle1 converter specific instead?).<br />
** Gradebook: There are important differences between how 1.9 and 2.0 backup information is handled. Scales / outcomes / grade items need annotation in inforef.xml files and also there are new xml files designed to store specifically grades (categories, items, grades...) information. Need analysis. (contact: Andrew).<br />
<br />
====After review, organization====<br />
<br />
This section will be used to annotate any agreement / conclusion / organization for the next weeks in case the Tracker isn't enough to do so. Feel free to use it, beloved colleagues, always using the R04xx nomenclature for referencing exact stuff, plz.<br />
<br />
=== See also ===<br />
<br />
* Go back to [[Development:Backup 2.0|Backup 2.0]] > [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x main page]].</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_-_Converters_review_2011-04&diff=83082
Development:Backup 2.0 - Converters review 2011-04
2011-04-28T10:17:32Z
<p>Stronk7: </p>
<hr />
<div>[[Development:Backup 2.0|Backup 2.0]] > [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x main page]] > Review 2011-04<br />
{{Template:Development:Backup 2.0}}{{Moodle_2.1}}<br />
<br />
This page summarizes the results of the review performed (on April 2011) over the code available at https://github.com/mrmark/moodle related to the implementation of a general solution for the creation and support of moodle restore converters and its first implementation as one Moodle 1.9 => 2.x converter.<br />
<br />
=== References ===<br />
<br />
* MDL-22414 - the main tracker issue for this task.<br />
* [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x article]] in Moodle Docs.<br />
* [http://tracker.moodle.org/secure/attachment/23241/Moodle1.9to2.0Restore.pdf PDF with initial implementation plan].<br />
* [https://github.com/mrmark/moodle/compare/master...converters_wip Development branch changes] <br />
<br />
=== Nomenclature ===<br />
<br />
* The review results are shown below as one list of numbered points, briefly explained, with link to corresponding MDL-xxxx (subtask of MDL-22414), where any discussion / agreement / coding should happen.<br />
* All the MDL-xxxx issue created will begin with R04xx to note they have been ignited as part of this review process and the point they correspond to.<br />
* Each point below includes one short "status" message in order to know the immediate actions that must be performed on it.<br />
* New points can be added to the review as long as discussion / agreement happens, if necessary.<br />
<br />
=== Global summary ===<br />
<br />
* Overall, all code seems to be in correct places and be correct code.<br />
* The main infrastructure parts (base/plan/moodle1 converters and plan/task/step architectures) are ok, though their APIs would need some improvements detailed below.<br />
* There are a lot of stuff missing / todo. Files, users, enrolments, plugins, tricky activities, comments, grades...<br />
* We need to push-push-push (4 weeks to freeze!).<br />
<br />
=== The list ===<br />
<br />
==== Related to integration with restore_controller & general behavior ====<br />
<br />
* R0401: status: to code. Right now, the to_moodle2_format() performs instantiation of all available converters + simple loop to get the conversions to perform. Instead, it should be possible to use exclusively static methods, returning origin format, target format and cost of the conversion, and then finding the best path or so. Note this is trivial right now but can be a useful general approach if new converters arrive (core and 3rd part).<br />
<br />
* R0402: status: to code. The can_convert() function can be static too, passing tempdir as param. Also, the same function (or another one, mandatory) should check if all the PHP/server requirements are satisfied or no (some converters can need extra stuff available in order to be able to perform conversions).<br />
<br />
* R0403: status: to discuss. After each conversion, the original source directory is deleted and replaced by the converted one. This makes things complex to trace or perform repeated conversions and also, doesn't observe the $CFG->keeptempdirectoriesonbackup completely. We should be able to keep temp stuff undeleted if desired and, perhaps too, be able to instruct the restore controller about tempdir changes.<br />
<br />
* R0404: status: to code. Exceptions: It needs to be decided if we are going to use own converter_exception/s or restore_exception/s and use them constantly along all the code base.<br />
<br />
* R0405: status: to code. Logging: Converters stuff must inherit / use restore_controller logging facilities.<br />
<br />
==== Related to the converters/moodle1 infrastructure ====<br />
<br />
* R0406: status: to discuss. All the parser / processor / path_elelement stuff is part of the abstract plan_converter. That stuff should be moved to moodle1_converter as far as it is highly dependent / tidied with the conversion particularities.<br />
<br />
* R0407: status: to discuss (not important). About converters, should class names and file names match, i.e. converter.class.php => moodle1_converter.class.php<br />
<br />
* R0408: status: to discuss. On restore, we have both after_restore() methods available in steps (executed when the step execution ends) and in tasks (executed when the whole plan execution ends). Do we need this duality in plan_converter, or is it enough with current one. Right now it seems that we are using a lot these methods to do the work, and process_xxx() should be used instead (together with next point).<br />
<br />
* R0409: status: to code. Since some weeks ago the notify_path_start/end() methods are available in the xml processor, should we start using them to call some stuff in converter, able to dispatch to start_xxxx() and end_xxxx() methods in the converter steps. It would help a lot with both starting/closing XML tags, creating and closing xml files, or any other pre/post stuff needing to be executed at certain stages.<br />
<br />
* R0410: status: to discuss. The deprecated/new/renamed elements / mutate_datum stuff. Perhaps it should be moved from steps to path_elements instead, so each path element autocontains the basic transformations to be performed on data and they are applied automatically. It seems a better place for that definitions. Or, alternatively, we'll need deprecated/new/renamed/mutate_xxxx() methods, one for each path.<br />
<br />
* R0411: status: to code. After looking current uses of the xml writer, it seems clear that we need some extra methods, able to print one tag completely, push/pop last open tag and other commodities in order to make coding easier.<br />
<br />
* R0412: status: to code. The "trick" in the parser about dynamically modify /MOD paths seems ok (I cannot imagine another way to implement it). Similar magic will be needed for blocks and surely, the start/end implementation above will need a similar way to handle/dispatch processing.<br />
<br />
* R0413: status: to code. Some raw accesses to the backup_ids_temp DB stuff must be modified to use helper functions. Also, the use of the table in get_context() can be really slow (text comparison). Look for some alternative.<br />
<br />
* R0414: status: to code. The convert_file() method uses the backup_ids_temp to get sequential fileid values. It should be enough (completely safe), to use one static (in memory) generator instead. No concurrence problems at all IMO.<br />
<br />
* R0415: status: to discuss. Support for plugins is a must as far as at least qtypes require it. Note that question types are going to suffer one major revamp on Moodle 2.1, so their final architecture is unknown right now (different from both 1.9 and 2.0).<br />
<br />
* R0416: status: to code (tiny detail). In current moodle1_conversion, original_site_identifier should be generated only if there is one original identifier. Right now it saves one "?" that can lead to wrong results detecting same sites.<br />
<br />
==== Related to coding in general ====<br />
<br />
* R0417: status: to code. Copyright messages are required on each new file. It must be the standard one with GPL3 msg and MR/Mark/whatever copyright.<br />
<br />
* R0418: status: to code. We should have as many tests as possible, specially testing all the infrastructure stuff, in order to guarantee it continues working as expected after any refactor / modification. Right now it's practically inexistent.<br />
<br />
* R0419: status: to do periodically. We need to keep the main repo for all the project "converters_wip" in sync (merged) with current moodle.git master branch in order to ensure stuff will land properly (conflicts-free) and converters will be able to use any new feature / improvement available.<br />
<br />
==== Related to pending & tricky areas ====<br />
<br />
* R020: status: to code. There are a lot of areas which coding hasn't been ignited yet (surely to pending work in the list above, don't worry). Here there is a brief ordered list, annotating the ones that will be really tricky:<br />
** Users and enrollments: All the users with their complete information must be saved to new users.xml file and each process_xxx() method must, continuously, be annotating needed uses in order to generate proper inforef.xml files. Enrolments will be all moved to manual ones (this needs confirmation).<br />
** Workshop activity: Completely revamped in 2.0. It has proper subplugins. Upgrade code needs to be deeply analyzed and XML differences too to know how to implement it. (contact: David).<br />
** Wiki activity: Also brand new in 2.0. Upgrade needs analysis and XML differences too. (contact: Dongsheng).<br />
** Resource activity: Split into file/folder/page/url activities. The structure is simple (no user data) but the split makes it really tricky. Also very file-intensive. Upgrade code needs analysis and XML differences (contact: Petr).<br />
** Files: 1.9 files can had site/course files (apart from the ones "owned" by the module @ moddata). They must be annotated and moved to new files.xml & storage. There is some code already but is not used in the general converter helper stuff (should be moodle1 converter specific instead?).<br />
** Gradebook: There are important differences between how 1.9 and 2.0 backup information is handled. Scales / outcomes / grade items need annotation in inforef.xml files and also there are new xml files designed to store specifically grades (categories, items, grades...) information. Need analysis. (contact: Andrew).<br />
<br />
====After review, organization====<br />
<br />
This section will be used to annotate any agreement / conclusion / organization for the next weeks in case the Tracker isn't enough to do so. Feel free to use it, beloved colleagues, always using the R04xx nomenclature for referencing exact stuff, plz.<br />
<br />
=== See also ===<br />
<br />
* Go back to [[Development:Backup 2.0|Backup 2.0]] > [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x main page]].</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_-_Provide_upwards_compatibility_of_Moodle_1.9.x_backups&diff=82987
Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups
2011-04-26T14:47:25Z
<p>Stronk7: /* See also */</p>
<hr />
<div>{{Template:Development:Backup 2.0}}{{Moodle_2.0}}{{Work in progress}}<br />
<br />
While the [[Development:Backup 2.0 multiple formats|Backup 2.0 multiple formats]] document describes how different formats will be supported by the restore process in Moodle 2.0, it's going to be a highly complex task to perform the transformation of Moodle 1.9.x backups into the new, improved, Moodle 2.x backup format. <br />
<br />
Too many things have changed between both versions to be able to achieve this easily. Surely it's computable (as long as upgrade is being able to apply the correct logic, so restore will) but it is going to be handled as a separate development that will allow us to 1) be centered in the 2.0 backup/restore and 2) be free (both in mind and implementation) from any 1.9.x XML format dependency.<br />
<br />
=== Goals and basis ===<br />
<br />
* The main goal is to create one '''conversion''' tool, able to get any Moodle 1.9 backup file and convert it to one Moodle 2.0 backup file. The tool '''will not perform any modification''' in the Moodle instance where it is being executed (i.e.the tool won't import anything). Once the conversion has finished, the standard Moodle 2.0 restore functionality will perform its job.<br />
* The tool will get one already-uncompressed directory containing one Moodle 1.9 backup file and will create all the needed stuff in the same directory.<br />
* The tool will have one unique entry point to perform the conversion and will be able to be invoked from within Moodle 2.0 (restore, performing conversion on the fly) or standalone (from CLI interface of any sort of batch processing).<br />
* The tool will be built using as much infrastructure from Moodle 2.0 as possible (xml processors, plugins, core stuff, logging, debugging...) and will be full OOP (and php, of course).<br />
* Ideally the conversion will happen in only 1-pass of xml parsing.<br />
* The tool will be licensed under GPL3 or later and bundled with future releases of Moodle.<br />
<br />
=== Introduction ===<br />
<br />
Before any further analysis is highly recommended to:<br />
<br />
* Know as much as possible about the Moodle 2.0 backup infrastructure. Reading the [[Development:Backup 2.0 general architecture| general architecture page]], looking at all the stuff available under the backup/moodle2 directories (each plugin has its own) and understanding how information flows and is stored.<br />
* Pay special attention and understand these parts of the Moodle 2.0 backup infrastructure:<br />
** XML parser: In charge of reading all the XML file and dispatching pieces to different processors (backup/util/xml/parser).<br />
** XML writer: In charge of writing XML files (util/xml/xml_writer.class.php and util/xml/output)<br />
** Chained loggers: To output any information about the process (backup/util/loggers).<br />
** Temporary tables, to store transient information if needed.<br />
<br />
==== Physical differences ====<br />
<br />
After reading the [[Development:Backup 2.0 general architecture| general architecture page]], it's clear that there are huge differences between the XML used in Moodle 1.9 backups and their Moodle 2.0 counterparts. Let's dissect them briefly:<br />
<br />
* We have changed from one unique monolithic '''moodle.xml''' file to a multiple xml files (and directories) alternative.<br />
* The course, each section and each activity has its own directory.<br />
* There are some top-level XML files (groups, users, files, questions, roles, scales...) acting as "containers" of information referenced from any course/section/activity (by their inforef.xml files).<br />
* We have moved from uppercase tags to lowercase everywhere<br />
* We are using XML attributes for some pieces of information (mainly ids).<br />
* When possible (modules mainly) the old XML-tree structure has been observed.<br />
<br />
==== Logical differences ====<br />
<br />
A lot of things have changed from Moodle 1.9 to Moodle 2.0, causing a lot of modifications in the DB schema and, as backup is highly dependent of that (it's basically one representation of the DB), the information present in the physical xml files above has changed in a noticeable way too.<br />
<br />
One good exercise is to create one, more or less, complete test course, backup it in Moodle 1.9, upgrade the site to Moodle 2.0 and backup it again. That way you'll see where each bit of information has ended in the new format. Also is a good task, in order to understand the changes, to read all the db/upgrade.php scripts present in Moodle 2.0. They show all the modifications performed along the time.<br />
<br />
At this point it's important to avoid get stressed, yes, there are many differences and tons of modifications, some of them really complex. But good news is that, if the upgrade.php scripts have been able to perform the change then, for sure, it is computable and the conversion tool will be able to do the same.<br />
<br />
Back to the logical differences, there are some of them needing special attention since day 0 (now):<br />
<br />
* '''files:''' Under Moodle 1.9, files were stored both in the named "course files" directory (one physical directory) and also under the "moddata" directory (files belonging to modules, like forum attachments, assignment submissions...). Under Moodle 2.0, all the files are physically stored into one file pool (a really cryptic hash-based storage solution) with one logical store in DB, with contexts, components, file areas, hashes and items. The conversion tool will need one sort of "file conversion tool" able to handle any transformation from the old to the new approach, used everywhere.<br />
* '''roles and enrolments:''' Moodle 1.9 enrolments were, simply, some role assignments performed at course level. This has been changed to a more powerful (dual) structure of both role assignments and proper enrollment-plugins. The conversion toll will need to do some "assumptions" in order to convert this information. Also it's important to note that, while in Moodle 1.9 backups the complete roles were being sent to XML (with all their capabilities and friends), this doesn't' happen anymore in Moodle 2.0 (where we only store basic information about them).<br />
* '''contexts:''' Under Moodle 1.9, the use of contexts (the course, each activity, each user is one, unique context) was really limited (basically only used for roles and capabilities. Under Moodle 2.0, there are way more information based on contexts (files, comments, ratings, filters, blocks...). Hence we'll need to assign one context for each component in the backup to be able to associate information to it along the conversion.<br />
* '''categories and questions:''' while the internal representation is pretty similar, now they are handled via standard plugins backup & restore in Moodle 2.0 (see question/type/xxxx/backup/moodle2) so some extra information (extra xml-levels) is required. The tool also should be handling the conversion in a plugin way, allowing other 3rd-part question types conversions to be implemented.<br />
* '''blocks:''' 90% of blocks haven't any special DB representation nor need especial processing, but the rest (see, for example, the html block or the rss_client one) need custom conversion. So the tool must allow conversion of blocks also in a plugin way.<br />
* '''activities:''' This is the most important part, where all the (educational POV) information resides. Of course, it must work in a plugin way. Here we'll find activities really easy to convert, because the only noticeable change has been their conversion to the new "files" (commented above). For example, the choice, glossary, forum... modules are good candidates to start with. But there are also some activities that have been completely rewritten / modified since Moodle 1.9. And they will be, without doubts, the most difficult ones to be handled by the conversion tool. Let's see some of them:<br />
** '''resource:''' Under Moodle 1.9 all we had were types of resources (page, directory...) but all them being types of the (unique) resource module. Under Moodle 2.0, the the module has been split into different modules, each one with its own DB representation and unique features (file, folder, page and url). This split will need to be detected and handled specially by the conversion tool.<br />
** '''wiki:''' Completely rewritten from scratch. Will need important changes both in the xml representation (100% different DB structure) and special process of all the contents (to translate from the old ewiki dialect to the new html implementation). Not to talk about binary contents that will also need special handling.<br />
** '''workshop:''' Also completely rewritten from scratch. Will need important changes in the xml representation, use of subplugins and special process of some contents.<br />
<br />
=== Overall process ===<br />
<br />
Here there is one ordered list that could serve as technical/development roadmap for the analysis and implementation of the Moodle 1.9 conversion tool. Surely some (practically all) the points below can be split into smaller tasks in order to allow work to advance in parallel. Ideally all them should have one representation as subtasks of MDL-22414. Each task has one alphanumeric code to be used as reference in the future:<br />
<br />
* '''A''': Preliminary Tasks<br />
** '''A1''': Initial report (this document)<br />
** '''A2''': Organization / roles / actors involved<br />
** '''A3''': Initial timeline specification<br />
** '''A4''': Documentation / research / learn<br />
** '''A5''': Testing use cases, QA specifications<br />
* '''B''': Infrastructure Tasks<br />
** '''B1''': XML Parser<br />
** '''B2''': Conversion dispatcher<br />
** '''B3''': XML writer<br />
** '''B4''': Support for plugins (questions, blocks, modules...)<br />
** '''B5''': Support for subplugins (workshop, assignments...)<br />
** '''B6''': Integration with Moodle 2.0 restore, logging, output...<br />
** '''B7''': Progress review / discuss / adjust / timeline<br />
* '''C''': Conversion Development Tasks<br />
** '''C1''': Globals (files / users / groups / scales / outcomes / roles / gradebook ...)<br />
** '''C2''': Course level information<br />
** '''C3''': Section level information<br />
** '''C4''': Activity level information<br />
** '''C5''': Commons (comments / completion / filters / grades / roles /logs ...)<br />
<br />
===Followups===<br />
<br />
* [[Development:Backup 2.0 - Converters review 2011-04|Review April 2011]]<br />
<br />
===See also===<br />
<br />
* MDL-22414 - the main tracker issue for this task</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Backup_2.0_-_Converters_review_2011-04&diff=82986
Development talk:Backup 2.0 - Converters review 2011-04
2011-04-26T14:45:18Z
<p>Stronk7: Created page with "Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --~~~~"</p>
<hr />
<div>Please, for discussing any of the points in the page, do it in the corresponding MDL-xxx issue in the Tracker. TIA! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 22:45, 26 April 2011 (WST)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_-_Converters_review_2011-04&diff=82985
Development:Backup 2.0 - Converters review 2011-04
2011-04-26T14:44:35Z
<p>Stronk7: Created page with "Backup 2.0 > Backup 1.9 => 2.x main page > Review 2011-04 {{Template..."</p>
<hr />
<div>[[Development:Backup 2.0|Backup 2.0]] > [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x main page]] > Review 2011-04<br />
{{Template:Development:Backup 2.0}}{{Moodle_2.1}}{{Work in progress}}<br />
<br />
This page summarizes the results of the review performed (on April 2011) over the code available at https://github.com/mrmark/moodle related to the implementation of a general solution for the creation and support of moodle restore converters and its first implementation as one Moodle 1.9 => 2.x converter.<br />
<br />
=== References ===<br />
<br />
* MDL-22414 - the main tracker issue for this task.<br />
* [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x article]] in Moodle Docs.<br />
* [http://tracker.moodle.org/secure/attachment/23241/Moodle1.9to2.0Restore.pdf PDF with initial implementation plan].<br />
* [https://github.com/mrmark/moodle/compare/master...converters_wip Development branch changes] <br />
<br />
=== Nomenclature ===<br />
<br />
* The review results are shown below as one list of numbered points, briefly explained, with link to corresponding MDL-xxxx (subtask of MDL-22414), where any discussion / agreement / coding should happen.<br />
* All the MDL-xxxx issue created will begin with R04 to note they have been ignited as part of this review process.<br />
* Each point below includes one short "status" message in order to know the immediate actions that must be performed on it.<br />
* New points can be added to the review as long as discussion / agreement happens, if necessary.<br />
<br />
=== Global summary ===<br />
<br />
<br />
=== The list ===<br />
<br />
=== See also ===<br />
<br />
* Go back to [[Development:Backup 2.0|Backup 2.0]] > [[Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups|Backup 1.9 => 2.x main page]].</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_for_developers&diff=82981
Development:Backup 2.0 for developers
2011-04-26T10:04:09Z
<p>Stronk7: /* Other components that can be backed up */</p>
<hr />
<div>{{Template:Development:Backup 2.0}}{{Moodle_2.0}}{{Work in progress}}<br />
<br />
== Introduction ==<br />
<br />
This page tries to explain, from a development perspective, '''how to implement''' the backup feature for various Moodle 2.x plugins, mainly, modules and blocks. <br />
<br />
Note that, at the time of writing this, the backup & restore subsystem itself is '''under development''', so still there are some missing bits, specially about the way to handle '''subplugins''' (question types, data fields...) under the new backup infrastructure, so any module using such artifacts, like data, assignment, quiz, workshop, aren't good candidates right now. This will be addressed (and this Docs updated) once we have determined how each subplugin is expected to work (from a DB / backup perspective).<br />
<br />
Everything in backup '''is about tasks and steps''' (see [[Development:Backup 2.0 general architecture|Backup 2.0 general architecture]] for more information), all them conforming one backup plan. Each module instance and each block instance will be backup by one backup task instance that is, basically, one collection of backup steps. How steps are organized within the task will dictate to the backup system what to do and in which order.<br />
<br />
Another important point is that Moodle backup 2.0, supports '''multiple backup formats''' ("moodle2", "imscc"...) each one having its own tasks/steps, completely unrelated between them. In any case, for now, we are focusing all the explanations below in the "moodle2" format, that is the one required in order to keep any module/block '''transportable between Moodle instances''' without any loss of data. Surely, for the rest of formats, we'll end with other documents describing them, as far as each one can have its own particularities.<br />
<br />
Talking about backup steps we must differentiate '''two type of steps''':<br />
<br />
* '''Execution steps''': That, simply, execute arbitrary PHP code. They are useful to prepare different structures, create directories, whatever have to be done not involving the generation of XML files. Normally you won't need them.<br />
* '''Structure steps''': That, using one PHP API (detailed below) define completely the XML structure to be exported and its contents. Hopefully, "normal" modules only will have to use one step of this type in order to have the backup functionality 100% implemented.<br />
<br />
Said that, in the next steps we are going through all the steps necessary to create the backup of one simple module and one block, in order to get all the possibilities covered.<br />
<br />
== How to backup one module ==<br />
<br />
For this section, we have selected one simple module (choice) that requires practically all the backup "machinery" to be used, so it will get explained as we progress in the development. The only point not covered here are the "subplugin" facilities, covered later in a separate section.<br />
<br />
=== Prerequisites ===<br />
<br />
In order to achieve the backup implementation for the module, some prerequisites should be fulfilled. They are just recommendations but, specially while getting used to backup, it's good to follow them. Let's see:<br />
<br />
# '''Learn about the module'''. If you aren't the creator of the module, spend some time playing with the module, creating and using it, exploring each one of its functionalities. By doing this you will end with some "real" data in the module instances that will be really useful when testing / debugging how the module backup is being generated.<br />
# '''Draw one schema of the module''' DB structures. While you are playing with the module, look continuously to the DB, how records are saved and which are the relations between the module's tables. As far a backup is, basically, one "selective dump" of those tables, knowing the maximum about them is highly recommended. At the end, you must end with one tree structure will be the basis for the generated XML file.<br />
# '''Annotate which tables contain user-related info''' and which ones don't. One of the core functionalities that must be present on each module is the ability to include user related information or skipping it, so you will need that information later.<br />
<br />
'''Tip''': If the module already existed before Moodle 2.0, it can be a '''good idea''' to take a look to its 1.9 backuplib.php file, as far as the structure is already defined there and can help to understand the organization better and, at the same time, '''keeping the XML structure as similar as possible''', that will, definitively, '''make things easier''' when converting 1.9 backup files to the new backup 2.0 format.<br />
<br />
'''Note''': It's important to highlight that the structure schema, once decided, should be as stable as possible along the time, because any change in the structure makes restore really way-more-more complex to be implemented. There isn't problems adding / deleting fields, nor adding new elements to the structure. But '''the structure (tree) itself must persist as stable as possible''', so please, be careful when deciding it.<br />
<br />
So, applying these pre-requisites to our candidate module (choice), here it's the corresponding schema. We'll use it along the whole process.<br />
<br />
=== Schema ===<br />
<br />
In the schema, you must try to put as much information as possible, so that will produce the coding process later to be quicker and easier while keeping the final results free from errors and missing bits. So, once more, don't start coding immediately, instead spend some time with the requisites above, understanding how the module works and designing the final structure that represents it better.<br />
<br />
==== The (correct) candidate ====<br />
<br />
[[Image:Backup20 choice alt.png|left|Alternative choice backup structure]]<br />
<br />
The tree on the left shows the ER/DB structure of the choice module, where one choice have one or more options and each option is answered by users one or more times (note: ignore cardinality accuracy in the previous phrase).<br />
<br />
And that's the best schema representing the structure of the module, with each element properly nested so, we won't have any problem with restore as far as the order required by restore (1, 2, 3) are naturally given. <br />
<br />
Looks easy, cool, but follow reading… you will get surprised! :-)<br style="clear: both" /><br />
<br />
==== The (chosen) candidate ====<br />
<br />
Instead we are going to use the (complete this time) diagram below. See the rationale about that after the image.<br />
<br />
[[Image:Backup20 choice.png|center|Used choice backup structure]]<br />
<br />
The main reason to use this tree (instead of the "correct") one is that this is the structure that has been used by Moodle 1.9 backup since ages ago for the choice module and, of course have done its work ok. As commented above we must '''try to reduce the number of structural changes''' in one module backup in order to keep the restore operations working along the time (the same is applicable for the conversion of 1.9 backup files to the new 2.0 format). Finally, this is a good example about how one module '''can have different XML representations''' and we need to try to get that best one (this is not the case) on each case. So, once more, '''spending some time analyzing''' the activity is worth it.<br />
<br />
Let's analyze the schema with some detail:<br />
<br />
* '''Detecting user information''': We must be able to define the entities (tables) in the diagram that are used to store user information. One of the core features of the backup subsystem since its early days have been the ability to produce backup with and without user information. So we need that info. Hence, the "no user info" in the choice and choice_options elements (they are configuration, user-independent), while the choice_answers is marked as "user info" (contains user's answers to the choice).<br />
<br />
* '''Determining the correct order of backup''': This, while simple, is critical too (especially from a restore perspective). As far as the restore reads progressively the xml file and performs actions in that order, we '''must guarantee that the "read order" is the correct''' one, fulfilling any possible dependency. Back to our schema it's clear that we need to backup the "choice" element at first, and then the "choice_options" and "choice_answers" ones. More yet, the "choice_options" must be backup before "choice_answers" as far as the later needs to save the values of the former (the "optionid" information). Be noted, that, as commented some paragraphs above, the "correct" alternative really gave us that order information easily. Doesn't matter as far as we have been able to establish it also in the "chosen" schema.<br />
<br />
* '''Attributes and elements''': Now it's time to decide which fields will be considered attributes in the resulting XML file and which ones will be child elements (tags). The rule is simple: '''All the "id" fields must (should) be defined as attributes'''. Note this is just one arbitrary rule without much rationale behind it as far as, from a restore perspective, everything (attributes and child tags) will be handled in the same way (object attributes). So, in our schema, all the "id" fields have been marked as "attr".<br />
<br />
* '''Not needed elements''': If we have designed properly the schema, we'll detect that some fields aren't necessary, as far as such information is already included in some parent element. In our schema, the field "choiceid", pointing to the "choice->id", both in the options and in the answer elements have been marked as "not needed" as far as their parent "choice" already contains it. Something similar happens with the "course" field in the choice element, it doesn't need to be included in the backup file as far as something above it (course element, out from the module scope) already has it defined. Finally, there is one element marked as "needed" that shows us, once more, that the schema we are using is not the best. In the "chosen" one, as far as "choice_answers" isn't nested under "choice_options" we must keep that field in the backup, or restore won't know to which option each answer belongs to. Instead, with the "correct" schema, where answers are nested under options, that field is not needed. Summarizing, '''any field, but those already existing in parent elements must be included in backup'''.<br />
<br />
* '''Detecting file areas used by the module''': Along the module we can be using various file areas in different elements and fields. We need to know exactly which file area is handled by which element and the (optional) itemid information used for that file area. In general, '''anything being one text field, or anything looking like one attachment''' has high chances to have one (hidden) file area associated. In our schema, we have one file area detected (choice_intro) corresponding to the introduction of the module and available to put any images or whatever in that field. Also, in general, all the "xxx_intro" file areas use to have no itemid, as far as the module's context is enough to define them without ambiguities. So, we mark the choice->intro as "choice_intro" file area and "no itemid"). From our expertise playing with the module we know there aren't more file areas at all.<br />
<br />
* <span id="annotate_is_important">'''Annotating some important bits''':</span> Due to the modularity of the backup and in order to know exactly which information must be saved (because it's used) and which one can be skipped, '''it's important to annotate some important elements along the whole backup''' process. So, back to our schema, we have marked the "choice_answer->userid" field as "annotation" (so backup will, automatically, add all the information for that user). Here it's the list of elements that we must not forget to annotate (or we could end with non-restorable backups). Note that we must, always, be annotating "id" values and not other types of data:<br />
** '''user''': Any field pointing to one user->id present along the schema (as said above, our schema has one).<br />
** '''grouping''': Any field pointing to one grouping->id<br />
** '''group''': Any field pointing to one group->id<br />
** '''role''': Any field pointing to one role->id<br />
** '''scale''': Any field pointing to one scale->id<br />
** '''outcome''': Any field pointing to one outcome->id<br />
<br />
And this is all the information we need to know, before starting to code. Surely, once used to backup and restore, you will be able to start coding sooner, but '''don't forget about the importance of choosing one good and stable structure''' before anything else. It's really the critical part of any module's backup.<br />
<br />
Said that, let's see how to code all this information in order to get one cool backup for our beloved module.<br />
<br />
=== Coding ===<br />
<br />
Already here? Have you read, al least once, all the explanations and comments in the previous sections? Yes? Sure? I can imagine it's hard to read so much text, just imagine how hard is to write it! Go, go, go and read it!<br />
<br />
Jokes apart, in this section we are going to code the module's (choice) backup code. As you'll see soon, all the information gathered in previous steps is really important and will make the coding task easier and less prone to errors.<br />
<br />
==== Setting up the environment ====<br />
<br />
By default, any backup operation will end with one .zip file stored in some course / section / activity area. That means that, each time you execute one backup, you'll need to go across the web interface to that file area, download the generated .zip file, uncompress it and then, see how things have been generated. And you will be executing a bunch of backup files until you get everything working as expected, so the whole develop / test process isn't really "agile". To improve things a bit, there is one $CFG setting that you should consider using '''in your development environment'''. Just put this in your config.php:<br />
<br />
<code php><br />
$CFG->keeptempdirectoriesonbackup = true;<br />
</code><br />
<br />
With this setting enabled, backup won't delete the temporary directory where everything is calculated, so you will be able to access to it directly, skipping all the ui / download / unzip steps above. Those temp directories are under $CFG->dataroot/temp/backup. Note that, for each backup invocation, a new directory is created.<br />
<br />
Also, in order to be able to execute backups quickly (instead of navigating along the UI), you can, simply, put one script like this in your $CFG->dirroot directory:<br />
<br />
<code php><br />
<?php<br />
<br />
require_once('config.php');<br />
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');<br />
<br />
$course_module_to_backup = XX; // Set this to one existing choice cmid in your dev site<br />
$user_doing_the_backup = YY; // Set this to the id of your admin accouun<br />
<br />
$bc = new backup_controller(backup::TYPE_1ACTIVITY, $course_module_to_backup, backup::FORMAT_MOODLE,<br />
backup::INTERACTIVE_NO, backup::MODE_GENERAL, $user_doing_the_backup);<br />
$bc->execute_plan();<br />
</code><br />
<br />
just set proper values for XX and YY above and execute it from your browser. If you get one error about one not found class (with the name of your module) everything is ok.<br />
<br />
==== Required stuff ====<br />
<br />
The first thing you need to make is to, explicitly, declare that your module (choice in our example) is going to support the MOODLE2 backup format, to do so, you need to go to mod/choice/lib.php and, in the choice_supports() function add one new feature by adding this line:<br />
<br />
<code php><br />
case FEATURE_BACKUP_MOODLE2: return true;<br />
</code><br />
<br />
If you execute another backup (with the script provided above, you will continue getting one error, as far as we haven't still coded anything related to backup, that's ok.<br />
<br />
Next step is to create the directory where all the backup code for the choice module will be. Just create the directory(s) mod/choice/backup/moodle2<br />
<br />
At this point, we have all the required stuff ready and all the pending tasks will be done under that recently created directory.<br />
<br />
==== Settings, Steps and Tasks ====<br />
<br />
In the introduction of the tutorial, we commented about backup being structured into tasks, each one being one collection of steps (and potentially using some custom settings). Those are, exactly, the objects that we need to create to achieve the backup functionality in our module.<br />
<br />
First of all, lets' create the settings file, where all the custom settings to be used by our module will be defined and implemented. It must be named '''mod/choice/backup/moodle2/backup_choice_settingslib.php''' and their contents are really meaningful:<br />
<br />
<code php><br />
<?php<br />
<br />
// This file is part of Moodle - http://moodle.org/<br />
//<br />
// Moodle is free software: you can redistribute it and/or modify<br />
// it under the terms of the GNU General Public License as published by<br />
// the Free Software Foundation, either version 3 of the License, or<br />
// (at your option) any later version.<br />
//<br />
// Moodle is distributed in the hope that it will be useful,<br />
// but WITHOUT ANY WARRANTY; without even the implied warranty of<br />
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br />
// GNU General Public License for more details.<br />
//<br />
// You should have received a copy of the GNU General Public License<br />
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.<br />
<br />
/**<br />
* @package moodlecore<br />
* @subpackage backup-moodle2<br />
* @copyright 2010 onwards YOUR_NAME_GOES_HERE {@link YOUR_URL_GOES_HERE}<br />
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later<br />
*/<br />
<br />
// This activity has not particular settings but the inherited from the generic<br />
// backup_activity_task so here there isn't any class definition, like the ones<br />
// existing in /backup/moodle2/backup_settingslib.php (activities section)<br />
</code><br />
<br />
Looks simple, isn't it? Nothing but a few comments. This is looking really easy. For now, we aren't going to introduce any custom setting for any module, only the "core activity settings" will be used. Once backup and Moodle 2.0 is stable we can start analyzing useful settings to customize how the module's backup is performed. For now, just leave it blank, please. In fact, if it's empty,''' you can safely not create it''' at all. It's here just for explanation purposes.<br />
<br />
Side note: To save some space, we only will be showing the © message/license in the code above. Just add it to each file created.<br />
<br />
Now we are going to create the steps file, where all the steps to be executed by our backup activity task will be defined and implemented. It must be named '''mod/choice/backup/moodle2/backup_choice_stepslib.php''' and their contents are these:<br />
<br />
<code php><br />
<?php<br />
<br />
/**<br />
* Define all the backup steps that will be used by the backup_choice_activity_task<br />
*/<br />
</code><br />
<br />
Yes, it's another empty file. No worries we'll fill it later.<br />
<br />
Finally we need to create the task file, where our just created settings and steps files will be included and used. It must be named '''mod/choice/backup/moodle2/backup_choice_activity_task.class.php''' and their contents are these:<br />
<br />
<code php><br />
<?php<br />
<br />
require_once($CFG->dirroot . '/mod/choice/backup/moodle2/backup_choice_stepslib.php'); // Because it exists (must)<br />
require_once($CFG->dirroot . '/mod/choice/backup/moodle2/backup_choice_settingslib.php'); // Because it exists (optional)<br />
<br />
/**<br />
* choice backup task that provides all the settings and steps to perform one<br />
* complete backup of the activity<br />
*/<br />
class backup_choice_activity_task extends backup_activity_task {<br />
<br />
/**<br />
* Define (add) particular settings this activity can have<br />
*/<br />
protected function define_my_settings() {<br />
// No particular settings for this activity<br />
}<br />
<br />
/**<br />
* Define (add) particular steps this activity can have<br />
*/<br />
protected function define_my_steps() {<br />
// Choice only has one structure step<br />
}<br />
<br />
/**<br />
* Code the transformations to perform in the activity in<br />
* order to get transportable (encoded) links<br />
*/<br />
static public function encode_content_links($content) {<br />
return $content;<br />
}<br />
}<br />
</code><br />
<br />
This is the main file (class) of the choice backup and it will be used to define any setting (define_my_settings() method) and any step (define_my_steps() method) to be executed in the backup process. It also contains one 3rd method (encode_content_links($content)) that will allow manually URLs pointing to the choice to be properly converted when the choice is moved to other site / course using the backup / restore functionality.<br />
<br />
As you see, for now, the three required methods are doing nothing. Just execute the backup again. Wow, no errors anymore. We have already fulfilled all the minimum coding needs in order to have the choice backup working. <br />
<br />
Now you should go to your $CFG->dataroot/temp/backup/xxxx directory (the more recent) and spend some time looking what has been created under the activities/choice_XX directory. There is already a lot of stuff that backup has generated for you: comments, blocks, logs, grades, module info, roles... some of them empty and others already showing real information.<br />
<br />
In any case, now, we need to add one important file there, the "choice.xml" where the real information for your module will be present, following the specs given by the schema we decided some sections above.<br />
<br />
So, let's go, it's time to create our choice structure step. To do so, we edit the '''mod/choice/backup/moodle2/backup_choice_stepslib.php''' file and add this code after the existing comments:<br />
<br />
<code php><br />
/**<br />
* Define the complete choice structure for backup, with file and id annotations<br />
*/ <br />
class backup_choice_activity_structure_step extends backup_activity_structure_step {<br />
<br />
protected function define_structure() {<br />
<br />
// To know if we are including userinfo<br />
$userinfo = $this->get_setting_value('userinfo');<br />
<br />
// Define each element separated<br />
<br />
// Build the tree<br />
<br />
// Define sources<br />
<br />
// Define id annotations<br />
<br />
// Define file annotations<br />
<br />
// Return the root element (choice), wrapped into standard activity structure<br />
<br />
}<br />
}<br />
</code><br />
<br />
So, we have defined one structure step that will be the responsible, using one PHP API to provide backup with all the information needed to generate the choice.xml file. Now, go back to the task file and add these contents in the define_my_steps() methods:<br />
<br />
<code php><br />
$this->add_step(new backup_choice_activity_structure_step('choice_structure', 'choice.xml'));<br />
</code><br />
<br />
That way, our choice task knows it must execute one new step, the one involving the generation of the choice.xml file. Let's execute one new backup and see results.You should be getting one new error with something like that "backup_structure_step_wrong_structure". It means that everything is ok up to now, the task has tried to execute the structure step, but this is not properly defined.<br />
<br />
===== Defining each element =====<br />
<br />
So, next step is about to define the choice structure. Going back to our step, under the ''// Define each element separate'' comment we'll add this code:<br />
<br />
<code php><br />
$choice = new backup_nested_element('choice', array('id'), array(<br />
'name', 'intro', 'introformat', 'publish',<br />
'showresults', 'display', 'allowupdate', 'allowunanswered',<br />
'limitanswers', 'timeopen', 'timeclose', 'timemodified'));<br />
<br />
$options = new backup_nested_element('options');<br />
<br />
$option = new backup_nested_element('option', array('id'), array(<br />
'text', 'maxanswers', 'timemodified'));<br />
<br />
$answers = new backup_nested_element('answers');<br />
<br />
$answer = new backup_nested_element('answer', array('id'), array(<br />
'userid', 'optionid', 'timemodified'));<br />
</code><br />
<br />
===== Return the root element =====<br />
<br />
And also, in order to get it working, let's define the return element, so, after the ''// Return the root element'' comment, add this code:<br />
<br />
<code php><br />
return $this->prepare_activity_structure($choice);<br />
</code><br />
<br />
Now we can execute the backup again and, a long as we have already defined the root element of the module, should have now one choice.xml file created (without proper contents but must be there).<br />
<br />
About the code above, all we have done is to define, separately each element that will be part of the choice.xml file. Special note about the $options and $answers elements. Since Moodle 1.9 we use to enclose real elements (the singular ones) inside one extra plural element, hence we create them here (as empty elements without attributes nor child tags). About the rest (the singular ones) we use 3 params in the instantiation:<br />
* The name of the element<br />
* One array of attributes of the element<br />
* One array of child tags (fields) of the element.<br />
And we include all the fields that previously we had defined in our schema '''but''' the ones marked as '''not needed'''.<br />
<br />
===== Building the tree =====<br />
<br />
Now it's time to declare the relations between all those elements, so, after the ''// Build the tree'' comment we'll add this code:<br />
<br />
<code php><br />
$choice->add_child($options);<br />
$options->add_child($option);<br />
<br />
$choice->add_child($answers);<br />
$answers->add_child($answer);<br />
</code><br />
<br />
Self explanatory, using $choice as root element, we define the whole tree using the add_child() method. And, of course, we respect '''the order''' that we had decided, so $options will be '''physically''' before $answers in the tree (and in the generated XML).<br />
<br />
===== Defining the sources =====<br />
<br />
After this, it's the moment to instruct our tree about how to fetch information from DB in order to generate the choice.xml file, so after the ''// Define sources'' comment, we'll add this code:<br />
<br />
<code php><br />
$choice->set_source_table('choice', array('id' => backup::VAR_ACTIVITYID));<br />
<br />
$option->set_source_sql('<br />
SELECT *<br />
FROM {choice_options}<br />
WHERE choiceid = ?',<br />
array(backup::VAR_PARENTID));<br />
<br />
// All the rest of elements only happen if we are including user info<br />
if ($userinfo) {<br />
$answer->set_source_table('choice_answers', array('choiceid' => '../../id'));<br />
}<br />
</code><br />
<br />
So we define the source for the $choice element as the information present in the 'choice' table for the id that is being backup (backup::VAR_ACTIVITYID). Or we define the source for the $option element like one SQL (could have been one table too, just to show more possibilities of the API, using the parent (the choice one) as value for the query (backup::VAR_PARENTID).<br />
<br />
And finally, conditionally, if user information is going to be included, we define the source for the $answer (note we had already annotated in our schema that this element was dependent of that). <br />
<br />
And we define the source condition as having the 'choiceid' field matching the value of the 'id' field two levels above (../../id). If you follow the tree created in the previous code section, that's exactly the choice->id (remember we have introduced one extra level (the plural one between the 'choice' and the 'answer' singular elements). Note this is 100% equivalent to use backup::VAR_PARENTID (as we have done in the $option source) just used to show possibilities of the API.<br />
<br />
Summarizing, with the API, we have these 3 method for defining sources:<br />
<br />
* '''set_source_table($tablename, array $conditions)''': When the information is get straight from one table (vast majority of cases in backup)<br />
* '''set_source_sql($sql, array $params)''': When the information doesn't map one table directly and we need something more complex<br />
* '''set_source_array($array)''': When we have some fixed information to backup. Not really useful in nested information, but used by core here and there.<br />
<br />
Note that both the $conditions and $params above only accept one limited number of constants or values (not all available in all backups!), mainly:<br />
<br />
* '''backup::VAR_COURSEID''': The id of the course this activity belongs to / the course id being backup<br />
* '''backup::VAR_SECTIONID''': The id of the section this activity belongs to / the section id being backup<br />
* '''backup::VAR_ACTIVITYID''': The id of the activity id being backup<br />
* '''backup::VAR_MODID''': The id of the course_module being backup<br />
* '''backup::VAR_MODULENAME''': The name of the module being backup<br />
* '''backup::VAR_BLOCKID''': The id of the block being backup<br />
* '''backup::VAR_BLOCKNAME''': The name of the block being backup<br />
* '''backup::VAR_CONTEXTID''': The context id of the activity / course being backup<br />
* '''backup::VAR_PARENTID''': The value of the first parent id found in the structure.<br />
* '''../some/path/to/parent''': To manually point to other value of any parent.<br />
<br />
Is important to note that, in 99% of the case we should be using, exclusively, some of the constants above, and backup, automatically will handle them properly. In case we have any other condition or param to be added like, for example, the number 23, or the string 'user', we cannot add them directly, but enclose them with the helper '''backup_helper::is_sqlparam(23)''' or '''backup_helper::is_sqlparam('user')'''. That way backup will know they are raw SQL params not needing any special handling, like the constants above.<br />
<br />
Well, now it's time to run backup again and take a look to our activities/choice_XX/choice.xml file. Now everything should be there, properly nested, the choice, the options and the answers. We are really near finishing now.<br />
<br />
===== Annotating IDs =====<br />
<br />
Now it's time to perform all the annotations that we had already detected in our analysis of the module. So, after the ''// Define id annotations'' comment we'll be adding:<br />
<br />
<code php><br />
$answer->annotate_ids('user', 'userid');<br />
</code><br />
<br />
It simply means, annotate for each $answer element, the value of the 'userid' field as one 'user' to be backup. In other words we are instructing backup that there is one new user to include later, when generating the users information and, at the same time, we are determining that those users are needed for the choice XX, so, if on restore we decide to skip that choice and such user isn't necessary for any other module / subsystem, it won't be restored. All this "uses" information is handled by the "inforef.xml" files within each activity backup, just in case you're interested to take a look to them. Else, just consider them, "dark magic".<br />
<br />
'''Note''': If you're not sure about which elements must be annotated, review [[Development:Backup 2.0 for developers #annotate_is_important|"Annotating some important bits"]] above for details about '''must-be-done''' annotations.<br />
<br />
===== Annotating files =====<br />
<br />
And, finally, reviewing our ellaborated and detailed schema, the last thing we need to take rid of are the file areas used, so, after the ''// Define file annotations'' comment we'll add:<br />
<br />
<code php><br />
$choice->annotate_files('mod_choice', 'intro', null); // This file area hasn't itemid<br />
</code><br />
<br />
That means that, within the $choice element we have one file area in use, of course belonging to the 'mod_choice' component (where all the choice module files belong to), named 'intro' and not using itemid (null). Note that, as far as it is possible to have multiple file areas in the same element (table), you may end having multiple calls to that method, one for each filearea to be added to backup. About the third parameter, in case we need it, it must be the name of one of the attributes or fields of the $choice element (usually, in the vast majority of cases, the 'id' of the element), otherwise we'll use null.<br />
<br />
=== One encoded wor(l)d ===<br />
<br />
Already out from the step definition, that should be working ok now, with the choice.xml file being generated and all the annotations being processed and added to the inforef.xml file, there is one more point to fulfill before considering choice's backup 100% finished.<br />
<br />
And it's about how to provide the ability to transform some links to the choice module when the backup file is restored into another server / course. That is automatically handled by a two-step approach:<br />
# On backup, we transform as many well-know URLs as possible to one encoded form.<br />
# On restore, we transform those encoded URLS back to their original form, but pointing to their new targets.<br />
<br />
So, in backup, we must provide services for the point 1 above, and that is done by adding some "encoding" conversions to the '''encode_content_links()''' method in our '''backup_choice_activity_task'''. So, define it to look like this<br />
<br />
<code php><br />
/**<br />
* Code the transformations to perform in the activity in<br />
* order to get transportable (encoded) links<br />
*/<br />
static public function encode_content_links($content) {<br />
global $CFG;<br />
<br />
$base = preg_quote($CFG->wwwroot,"/");<br />
<br />
// Link to the list of choices<br />
$search="/(".$base."\/mod\/choice\/index.php\?id\=)([0-9]+)/";<br />
$content= preg_replace($search, '$@CHOICEINDEX*$2@$', $content);<br />
<br />
// Link to choice view by moduleid<br />
$search="/(".$base."\/mod\/choice\/view.php\?id\=)([0-9]+)/";<br />
$content= preg_replace($search, '$@CHOICEVIEWBYID*$2@$', $content);<br />
<br />
return $content;<br />
}<br />
</code><br />
<br />
Básically, it gets any URL (manually written) in any content of the backup being generated and transform some (well-known) URLs to one encoded alternative. In this case we are encoding:<br />
* Any URL pointing to the list of choices in a course == is changed to ==> $@CHOICEINDEX*XX@$<br />
* Any URL pointing to one exact choice == is changed to ==> $@CHOICEVIEWBYID*YY@$<br />
<br />
In restore, well have the opposite conversions happening, replacing the XX and YY above to their new equivalents, so those links will be transportable via backup/restore without any need to edit them manually later.<br />
<br />
Tip: Don't forget to look to the module's 1.9 backup code, as far as there you'll find which conversions must be considered to be added here.<br />
<br />
=== Final notes ===<br />
<br />
* Don't get stressed, it's really more difficult / longer to explain than to do it. 100% guaranteed, else we'll return your money. :-P<br />
* If you've become lost, or your code is not working properly, you always can [http://cvs.moodle.org/moodle/mod/choice/backup/moodle2/ see the complete choice working code in CVS]. Or, alternatively, look to other well known modules, like [http://cvs.moodle.org/moodle/mod/forum/backup/moodle2/ forum] or also the [http://cvs.moodle.org/moodle/backup/moodle2/backup_stepslib.php?view=markup big core library of steps], where you will find all sort of uses of the API.<br />
* If you are going to implement backup for module XXXX, just copy this document, replace any "choice" occurrence within it by XXXX and follow it from the beginning to the end. Should work.<br />
* If the module already existed in Moodle 1.x, try to follow the same structure if possible, that will make things easier for restore / conversion.<br />
* Right now there are some pending tasks related with different exceptions that will be thrown if you code something wrongly (bad nesting, incorrect field names, bad constant/sql param uses...) and how they are shown. Fix for that will be coming soon.<br />
* Also, as stated at the beginning of this tutorial, we are still missing "subplugins" final support in modules, so try to avoid implementing backup on them for now. Once ready, there will be one new section in this document about them.<br />
* Any question / improvement / comment, feel free to contact with Moodle HQ, better if using the Tracker or, alternatively, forums / email / direct contact with your very-best-developer-friend. Note this is version x.0 (dot zero) of the backup API, so sure there are possibilities to improve it along the time.<br />
<br />
== Other components that can be backed up ==<br />
<br />
Most plugins which can be added to a course can also include data in a course backup. Some examples:<br />
<br />
* Course formats<br />
* Themes: [[Development: Backup 2.0 theme data| Backup 2.0 theme data]]<br />
* Plagiarism plugins</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Commit_cheat_sheet&diff=82835
Development talk:Commit cheat sheet
2011-04-18T00:13:27Z
<p>Stronk7: Created page with "=== MDL-xxxxx code area: short description of the patch === Cannot we, please, stop inventing things continuously? Where did the new colons come from? Mars? LOL I thought a lot..."</p>
<hr />
<div>=== MDL-xxxxx code area: short description of the patch ===<br />
<br />
Cannot we, please, stop inventing things continuously? Where did the new colons come from? Mars? LOL<br />
<br />
I thought a lot of us were using, since ages ago:<br />
<br />
<code><br />
MDL-xxxxx code area - short description of the patch<br />
</code><br />
<br />
In any case, as far as it's one recommendation, it doesn't matter too much (or yes, I really cannot believe the iterations we are having here). Please stop innovating and/or clarify it, grrr. With love, --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 08:13, 18 April 2011 (WST)<br />
<br />
----</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:MediaWiki_TeX_test&diff=82760
Development:MediaWiki TeX test
2011-04-14T16:45:43Z
<p>Stronk7: </p>
<hr />
<div>This should look like some maths:<br />
<br />
<math>\int_{-\infty}^\infty \psi^{-x^{tim}}\,dx = \sqrt{hunt^4}</math><br />
<br />
(This page was created for the benefit of MDLSITE-649.)<br />
<br />
Heavy test:<br />
<br />
== Functions, symbols, special characters ==<br />
<br />
<!-- Eight symbols per line seems to be optimal--><br />
{| class="wikitable"<br />
! colspan="2" |<h3>Accents/Diacritics</h3><br />
|-<br />
|<code>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}</code><br />
|<math>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}\,\!</math><br />
|-<br />
|<code>\check{a} \bar{a} \ddot{a} \dot{a}</code><br />
|<math>\check{a} \bar{a} \ddot{a} \dot{a}\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Standard functions</h3><br />
|-<br />
|<code>\sin a \cos b \tan c</code><br />
|<math>\sin a \cos b \tan c\!</math><br />
|-<br />
|<code>\sec d \csc e \cot f</code><br />
|<math>\sec d \csc e \cot f\,\!</math><br />
|-<br />
|<code>\arcsin h \arccos i \arctan j</code><br />
|<math>\arcsin h \arccos i \arctan j\,\!</math><br />
|-<br />
|<code>\sinh k \cosh l \tanh m \coth n\!</code><br />
|<math>\sinh k \cosh l \tanh m \coth n\!</math><br />
|-<br />
|<code>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</code><br />
|<math>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</math><br />
|-<br />
|<code>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t</code><br />
|<math>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t\,\!</math><br />
|-<br />
|<code>\lim u \limsup v \liminf w \min x \max y\!</code><br />
|<math>\lim u \limsup v \liminf w \min x \max y\!</math><br />
|-<br />
|<code>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</code><br />
|<math>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</math><br />
|-<br />
|<code>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n</code><br />
|<math>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Modular arithmetic</h3><br />
|-<br />
|<code>s_k \equiv 0 \pmod{m}</code><br />
|<math>s_k \equiv 0 \pmod{m}\,\!</math><br />
|-<br />
|<code>a\,\bmod\,b</code><br />
|<math>a\,\bmod\,b\,\!</math><br />
|-<br />
! colspan="2" | <h3>Derivatives</h3><br />
|-<br />
|<code>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</code><br />
|<math>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Sets</h3><br />
|-<br />
|<code>\forall \exists \empty \emptyset \varnothing</code><br />
|<math>\forall \exists \empty \emptyset \varnothing\,\!</math><br />
|-<br />
|<code>\in \ni \not \in \notin \subset \subseteq \supset \supseteq</code><br />
|<math>\in \ni \not \in \notin \subset \subseteq \supset \supseteq\,\!</math><br />
|-<br />
|<code>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus</code><br />
|<math>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus\,\!</math><br />
|-<br />
|<code>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup</code><br />
|<math>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Operators</h3><br />
|-<br />
|<code>+ \oplus \bigoplus \pm \mp - </code><br />
|<math>+ \oplus \bigoplus \pm \mp - \,\!</math><br />
|-<br />
|<code>\times \otimes \bigotimes \cdot \circ \bullet \bigodot</code><br />
|<math>\times \otimes \bigotimes \cdot \circ \bullet \bigodot\,\!</math><br />
|-<br />
|<code>\star * / \div \frac{1}{2}</code><br />
|<math>\star * / \div \frac{1}{2}\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Logic</h3><br />
|-<br />
|<code>\land (or \and) \wedge \bigwedge \bar{q} \to p</code><br />
|<math>\land \wedge \bigwedge \bar{q} \to p\,\!</math><br />
|-<br />
|<code>\lor \vee \bigvee \lnot \neg q \And</code><br />
|<math>\lor \vee \bigvee \lnot \neg q \And\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Root</h3><br />
|-<br />
|<code>\sqrt{2} \sqrt[n]{x}</code><br />
|<math>\sqrt{2} \sqrt[n]{x}\,\!</math><br />
|-<br />
! colspan="2" | <h3>Relations</h3><br />
|-<br />
|<code>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}</code><br />
|<math>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}\,\!</math><br />
|-<br />
|<code>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto</code><br />
|<math>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Geometric</h3><br />
|-<br />
|<code><nowiki>\Diamond \Box \triangle \angle \perp \mid \nmid \| 45^\circ</nowiki></code><br />
|<math>\Diamond \, \Box \, \triangle \, \angle \perp \, \mid \; \nmid \, \| 45^\circ\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Arrows</h3><br />
|-<br />
|<code>\leftarrow (or \gets) \rightarrow (or \to) \nleftarrow \nrightarrow \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow</code><br />
|<math>\leftarrow \rightarrow \nleftarrow \not\to \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow \,\!</math><br />
|-<br />
|<code>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow (or \iff)</code><br />
|<math>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow \!</math><br />
|-<br />
|<code>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow</code><br />
|<math>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow \!</math><br />
|-<br />
|<code>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons</code><br />
|<math>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons \,\!</math><br />
|-<br />
|<code>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright</code><br />
|<math>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright \,\!</math><br />
|-<br />
|<code>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft</code><br />
|<math>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft \,\!</math><br />
|-<br />
|<code>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow </code><br />
|<math>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow \,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Special</h3><br />
|-<br />
|<code>\And \eth \S \P \% \dagger \ddagger \ldots \cdots</code><br />
|<math>\And \eth \S \P \% \dagger \ddagger \ldots \cdots\,\!</math><br />
|-<br />
|<code>\smile \frown \wr \triangleleft \triangleright \infty \bot \top</code><br />
|<math>\smile \frown \wr \triangleleft \triangleright \infty \bot \top\,\!</math><br />
|-<br />
|<code>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar</code><br />
|<math>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar\,\!</math><br />
|-<br />
|<code>\ell \mho \Finv \Re \Im \wp \complement</code><br />
|<math>\ell \mho \Finv \Re \Im \wp \complement\,\!</math><br />
|-<br />
|<code>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp</code><br />
|<math>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Unsorted (new stuff)</h3><br />
|-<br />
|<code> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</code><br />
|<math> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</math><br />
|-<br />
|<code> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge</code><br />
|<math> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge\!</math><br />
|-<br />
|<code> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</code><br />
|<math> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</math><br />
|-<br />
|<code> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</code><br />
|<math> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</math><br />
|-<br />
|<code> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</code><br />
|<math> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</math><br />
|-<br />
|<code> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</code><br />
|<math> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</math><br />
|-<br />
|<code> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</code><br />
|<math> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</math><br />
|-<br />
|<code> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</code><br />
|<math> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</math><br />
|-<br />
|<code> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</code><br />
|<math> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</math><br />
|-<br />
|<code> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</code><br />
|<math> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</math><br />
|-<br />
|<code> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</code><br />
|<math> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</math><br />
|-<br />
|<code> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</code><br />
|<math> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</math><br />
|-<br />
|<code>\subsetneq</code><br />
|<math>\subsetneq</math><br />
|-<br />
|<code> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</code><br />
|<math> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</math><br />
|-<br />
|<code> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</code><br />
|<math> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</math><br />
|-<br />
|<code> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</code><br />
|<math> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</math><br />
|-<br />
|<code>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus</code><br />
|<math>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus\,\!</math><br />
|-<br />
|<code>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq</code><br />
|<math>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq\,\!</math><br />
|-<br />
|<code>\dashv \asymp \doteq \parallel</code><br />
|<math>\dashv \asymp \doteq \parallel\,\!</math><br />
|-<br />
|<code>\ulcorner \urcorner \llcorner \lrcorner</code><br />
|<math>\ulcorner \urcorner \llcorner \lrcorner</math><br />
|}<br />
<br />
== Larger Expressions ==<br />
=== Subscripts, superscripts, integrals ===<br />
{| border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"<br />
!rowspan="2"|Feature!!rowspan="2"|Syntax!!colspan="2"|How it looks rendered<br />
|-<br />
!HTML!!PNG<br />
|-<br />
|-<br />
|Superscript||<code>a^2</code>||<math>a^2</math>||<math>a^2 \,\!</math><br />
|-<br />
|Subscript||<code>a_2</code>||<math>a_2</math>||<math>a_2 \,\!</math><br />
|-<br />
|rowspan=2|Grouping||<code>a^{2+2}</code>||<math>a^{2+2}</math>||<math>a^{2+2}\,\!</math><br />
|-<br />
|<code>a_{i,j}</code>||<math>a_{i,j}</math>||<math>a_{i,j}\,\!</math><br />
|-<br />
|rowspan=2|Combining sub & super without and with horizontal separation||<code>x_2^3</code>||<math>x_2^3</math>||<math>x_2^3 \,\!</math><br />
|-<br />
|<code>{x_2}^3</code>||<math>{x_2}^3</math>||<math>{x_2}^3 \,\!</math><br />
|-<br />
|Super super||<code>10^{10^{ \,\!{8} }</code>||colspan=2|<math>10^{10^{ \,\! 8 } }</math><br />
|-<br />
|Super super||<code>10^{10^{ \overset{8}{} }}</code>||colspan=2|<math>10^{10^{ \overset{8}{} }}</math><br />
|-<br />
|Super super (wrong in HTML in some browsers)||<code>10^{10^8}</code> ||colspan=2|<math>10^{10^8}</math><br />
|-<br />
|rowspan="2"|Preceding and/or Additional sub & super||<code>\sideset{_1^2}{_3^4}\prod_a^b</code>||colspan=2|<math>\sideset{_1^2}{_3^4}\prod_a^b</math><br />
|-<br />
|<code>{}_1^2\!\Omega_3^4</code>||colspan=2|<math>{}_1^2\!\Omega_3^4</math><br />
|-<br />
|rowspan="4"|Stacking<br />
|<code>\overset{\alpha}{\omega}</code>||colspan="2"|<math>\overset{\alpha}{\omega}</math><br />
|-<br />
|<code>\underset{\alpha}{\omega}</code>||colspan="2"|<math>\underset{\alpha}{\omega}</math><br />
|-<br />
|<code>\overset{\alpha}{\underset{\gamma}{\omega}}</code>||colspan="2"|<math>\overset{\alpha}{\underset{\gamma}{\omega}}</math><br />
|-<br />
|<code>\stackrel{\alpha}{\omega}</code>||colspan="2"|<math>\stackrel{\alpha}{\omega}</math><br />
|-<br />
|Derivative (forced PNG)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki>\!</code>||&nbsp;||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (f in italics may overlap primes in HTML)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki></code>||<math>x', y'', f', f''</math>||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (wrong in HTML)||<code>x^\prime, y^{\prime\prime}</code>||<math>x^\prime, y^{\prime\prime}</math>||<math>x^\prime, y^{\prime\prime}\,\!</math><br />
|-<br />
|Derivative (wrong in PNG)||<code>x\prime, y\prime\prime</code>||<math>x\prime, y\prime\prime</math>||<math>x\prime, y\prime\prime\,\!</math><br />
|-<br />
|Derivative dots||<code>\dot{x}, \ddot{x}</code>||colspan=2|<math>\dot{x}, \ddot{x}</math><br />
|-<br />
|rowspan="3"|Underlines, overlines, vectors||<code>\hat a \ \bar b \ \vec c</code>||colspan=2|<math>\hat a \ \bar b \ \vec c</math><br />
|-<br />
|<code>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</code>||colspan=2|<math>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</math><br />
|-<br />
|<code>\overline{g h i} \ \underline{j k l}</code>||colspan=2|<math>\overline{g h i} \ \underline{j k l}</math><br />
|-<br />
|Arrows||<code> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</code>||colspan=2|<math> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</math><br />
|-<br />
|Overbraces||<code>\overbrace{ 1+2+\cdots+100 }^{5050}</code>||colspan=2|<math>\overbrace{ 1+2+\cdots+100 }^{5050}</math><br />
|-<br />
|Underbraces||<code>\underbrace{ a+b+\cdots+z }_{26}</code>||colspan=2|<math>\underbrace{ a+b+\cdots+z }_{26}</math><br />
|-<br />
|Sum||<code>\sum_{k=1}^N k^2</code>||colspan=2|<math>\sum_{k=1}^N k^2</math><br />
|-<br />
|Sum (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \sum_{k=1}^N k^2 </code>||colspan=2|<math>\textstyle \sum_{k=1}^N k^2</math><br />
|-<br />
|Product||<code>\prod_{i=1}^N x_i</code>||colspan=2|<math>\prod_{i=1}^N x_i</math><br />
|-<br />
|Product (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \prod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \prod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct||<code>\coprod_{i=1}^N x_i</code>||colspan=2|<math>\coprod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \coprod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \coprod_{i=1}^N x_i</math><br />
|-<br />
|Limit||<code>\lim_{n \to \infty}x_n</code>||colspan=2|<math>\lim_{n \to \infty}x_n</math><br />
|-<br />
|Limit (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \lim_{n \to \infty}x_n</code>||colspan=2|<math>\textstyle \lim_{n \to \infty}x_n</math><br />
|-<br />
|Integral||<code>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (alternate limits style)||<code>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \int\limits_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int\limits_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>, alternate limits style)||<code>\textstyle \int_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Double integral||<code>\iint\limits_D \, dx\,dy</code>||colspan=2|<math>\iint\limits_D \, dx\,dy</math><br />
|-<br />
|Triple integral||<code>\iiint\limits_E \, dx\,dy\,dz</code>||colspan=2|<math>\iiint\limits_E \, dx\,dy\,dz</math><br />
|-<br />
|Quadruple integral||<code>\iiiint\limits_F \, dx\,dy\,dz\,dt</code>||colspan=2|<math>\iiiint\limits_F \, dx\,dy\,dz\,dt</math><br />
|-<br />
|Line or path integral||<code>\int_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\int_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Closed line or path integral||<code>\oint_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\oint_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Intersections||<code>\bigcap_1^n p</code>||colspan=2|<math>\bigcap_1^n p</math><br />
|-<br />
|Unions||<code>\bigcup_1^k p</code>||colspan=2|<math>\bigcup_1^k p</math><br />
|}<br />
<br />
=== Fractions, matrices, multilines ===<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>Fractions</td><br />
<td><code>\frac{2}{4}=0.5</code></td><br />
<td><math>\frac{2}{4}=0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Small Fractions</td><br />
<td><code>\tfrac{2}{4} = 0.5</code></td><br />
<td><math>\tfrac{2}{4} = 0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (normal) Fractions</td><br />
<td><code>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a </code></td><br />
<td><math>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (nested) Fractions</td><br />
<td><code>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</code></td><br />
<td><math>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Binomial coefficients</td><br />
<td><code>\binom{n}{k}</code></td><br />
<td><math>\binom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Small Binomial coefficients</td><br />
<td><code>\tbinom{n}{k}</code></td><br />
<td><math>\tbinom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Large (normal) Binomial coefficients</td><br />
<td><code>\dbinom{n}{k}</code></td><br />
<td><math>\dbinom{n}{k}</math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="7">Matrices</td><br />
<td><pre>\begin{matrix}<br />
x & y \\<br />
z & v <br />
\end{matrix}</pre></td><br />
<td><math>\begin{matrix} x & y \\ z & v<br />
\end{matrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{vmatrix}<br />
x & y \\<br />
z & v <br />
\end{vmatrix}</pre></td><br />
<td><math>\begin{vmatrix} x & y \\ z & v<br />
\end{vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Vmatrix}<br />
x & y \\<br />
z & v<br />
\end{Vmatrix}</pre></td><br />
<td><math>\begin{Vmatrix} x & y \\ z & v<br />
\end{Vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{bmatrix}<br />
0 & \cdots & 0 \\<br />
\vdots & \ddots & \vdots \\ <br />
0 & \cdots & 0<br />
\end{bmatrix}</pre></td><br />
<td><math>\begin{bmatrix} 0 & \cdots & 0 \\ \vdots<br />
& \ddots & \vdots \\ 0 & \cdots &<br />
0\end{bmatrix} </math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Bmatrix}<br />
x & y \\<br />
z & v<br />
\end{Bmatrix}</pre></td><br />
<td><math>\begin{Bmatrix} x & y \\ z & v<br />
\end{Bmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{pmatrix}<br />
x & y \\<br />
z & v <br />
\end{pmatrix}</pre></td><br />
<td><math>\begin{pmatrix} x & y \\ z & v<br />
\end{pmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</pre></td><br />
<td><math><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</math></td><br />
</tr><br />
<br />
<br />
<br />
<tr><br />
<td>Case distinctions</td><br />
<td><pre><br />
f(n) = <br />
\begin{cases} <br />
n/2, & \mbox{if }n\mbox{ is even} \\<br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases}</pre></td><br />
<td><math>f(n) = <br />
\begin{cases}<br />
n/2, & \mbox{if }n\mbox{ is even} \\ <br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases} </math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="2">Multiline equations</td><br />
<td><pre><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</pre></td><br />
<td><math><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</pre></td><br />
<td><math><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</math></td><br />
</tr><br />
<tr><br />
<td>Multiline equations <small>(must define number of colums used ({lcr}) <small>(should not be used unless needed)</small></small></td><br />
<td><pre><br />
\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Multiline equations (more)</td><br />
<td><pre><br />
\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Breaking up a long expression so that it wraps when necessary, at the expense of destroying correct spacing</td><br />
<td><pre><br />
<nowiki><br />
<math>f(x) \,\!</math><br />
<math>= \sum_{n=0}^\infty a_n x^n </math><br />
<math>= a_0+a_1x+a_2x^2+\cdots</math><br />
</nowiki><br />
</pre><br />
</td><br />
<td><br />
<math>f(x) \,\!</math><math>= \sum_{n=0}^\infty a_n x^n </math><math>= a_0 +a_1x+a_2x^2+\cdots</math><br />
</td><br />
</tr><br />
<br />
<tr><br />
<td>Simultaneous equations</td><br />
<td><pre>\begin{cases}<br />
3x + 5y + z \\<br />
7x - 2y + 4z \\<br />
-6x + 3y + 2z <br />
\end{cases}</pre></td><br />
<td><math>\begin{cases} 3x + 5y + z \\ 7x - 2y + 4z \\ -6x + 3y + 2z \end{cases}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Arrays</td><br />
<td><pre><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</pre></td><br />
<td><math><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</math></td><br />
</tr><br />
</table><br />
<br />
=== Parenthesizing big expressions, brackets, bars ===<br />
{| class="wikitable"<br />
! Feature !! Syntax !! How it looks rendered<br />
|-<br />
| Bad<br />
| <code>( \frac{1}{2} )</code><br />
| <math>( \frac{1}{2} )</math><br />
|-<br />
| Good<br />
| <code>\left ( \frac{1}{2} \right )</code><br />
| <math>\left ( \frac{1}{2} \right )</math><br />
|}<br />
<br />
You can use various delimiters with \left and \right: <br />
<br />
{| class="wikitable"<br />
! Feature<br />
! Syntax<br />
! How it looks rendered<br />
|-<br />
| Parentheses<br />
| <code>\left ( \frac{a}{b} \right )</code><br />
| <math>\left ( \frac{a}{b} \right )</math><br />
|-<br />
| Brackets<br />
| <code>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</code><br />
| <math>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</math><br />
|-<br />
| Braces<br />
| <code>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</code><br />
| <math>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</math><br />
|-<br />
| Angle brackets<br />
| <code>\left \langle \frac{a}{b} \right \rangle</code><br />
| <math>\left \langle \frac{a}{b} \right \rangle</math><br />
|-<br />
| Bars and double bars<br />
| <code><nowiki>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</nowiki></code><br />
| <math>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</math><br />
|-<br />
| Floor and ceiling functions:<br />
| <code>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</code><br />
| <math>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</math><br />
|-<br />
| Slashes and backslashes<br />
| <code>\left / \frac{a}{b} \right \backslash</code><br />
| <math>\left / \frac{a}{b} \right \backslash</math><br />
|-<br />
| Up, down and up-down arrows<br />
| <code>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</code><br />
| <math>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</math><br />
|-<br />
| Delimiters can be mixed,<br/>as long as \left and \right match<br />
| <code><nowiki>\left [ 0,1 \right )</code> <br/> <code>\left \langle \psi \right |</nowiki></code><br />
| <math>\left [ 0,1 \right )</math> <br/> <math>\left \langle \psi \right |</math><br />
|-<br />
| Use \left. and \right. if you don't<br/>want a delimiter to appear:<br />
| <code>\left . \frac{A}{B} \right \} \to X</code><br />
| <math>\left . \frac{A}{B} \right \} \to X</math><br />
|-<br />
| rowspan="7" | Size of the delimiters<br />
| <code>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]/<code><br />
| <math>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]</math><br />
|-<br />
| <code>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</code><br />
| <math>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</math><br />
|-<br />
| <code><nowiki>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</nowiki></code><br />
| <math>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</math><br />
|-<br />
| <code>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</code><br />
| <math>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</math><br />
|-<br />
| <code>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</code><br />
| <math>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</math><br />
|-<br />
| <code>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</code><br />
| <math>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</math><br />
|-<br />
| <code>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</code><br />
| <math>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</math><br />
|}<br />
<br />
== Alphabets and typefaces == <br />
[[w:Texvc|Texvc]] cannot render arbitrary [[w:Unicode|Unicode]] characters. Those it can handle can be entered by the expressions below.<br />
For others, such as [[w:Cyrillic|Cyrillic]], they can be entered as Unicode or HTML entities in running text, but cannot be used in displayed formulas.<br />
<br />
{| class="wikitable"<br />
! colspan="2" | Greek alphabet<br />
|-<br />
|<code><nowiki>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta</nowiki></code><br />
|<math>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \,\!</math><br />
|-<br />
|<code><nowiki>\Eta \Theta \Iota \Kappa \Lambda \Mu</nowiki></code><br />
|<math>\Eta \Theta \Iota \Kappa \Lambda \Mu \,\!</math><br />
|-<br />
|<code><nowiki>\Nu \Xi \Pi \Rho \Sigma \Tau</nowiki></code><br />
|<math>\Nu \Xi \Pi \Rho \Sigma \Tau\,\!</math><br />
|-<br />
|<code><nowiki>\Upsilon \Phi \Chi \Psi \Omega</nowiki></code><br />
|<math>\Upsilon \Phi \Chi \Psi \Omega \,\!</math><br />
|-<br />
|<code><nowiki>\alpha \beta \gamma \delta \epsilon \zeta</nowiki></code><br />
|<math>\alpha \beta \gamma \delta \epsilon \zeta \,\!</math><br />
|-<br />
|<code><nowiki>\eta \theta \iota \kappa \lambda \mu</nowiki></code><br />
|<math>\eta \theta \iota \kappa \lambda \mu \,\!</math><br />
|-<br />
|<code><nowiki>\nu \xi \pi \rho \sigma \tau</nowiki></code><br />
|<math>\nu \xi \pi \rho \sigma \tau \,\!</math><br />
|-<br />
|<code><nowiki>\upsilon \phi \chi \psi \omega</nowiki></code><br />
|<math>\upsilon \phi \chi \psi \omega \,\!</math><br />
|-<br />
|<code><nowiki>\varepsilon \digamma \vartheta \varkappa</nowiki></code><br />
|<math>\varepsilon \digamma \vartheta \varkappa \,\!</math><br />
|-<br />
|<code><nowiki>\varpi \varrho \varsigma \varphi</nowiki></code><br />
|<math>\varpi \varrho \varsigma \varphi\,\!</math><br />
|-<br />
! colspan="2" | Blackboard Bold/Scripts<br />
|-<br />
|<code><nowiki>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G}</nowiki></code><br />
|<math>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M}</nowiki></code><br />
|<math>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T}</nowiki></code><br />
|<math>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}</nowiki></code><br />
|<math>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}\,\!</math><br />
|-<br />
! colspan="2" | boldface (vectors)<br />
|-<br />
|<code><nowiki>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G}</nowiki></code><br />
|<math>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M}</nowiki></code><br />
|<math>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T}</nowiki></code><br />
|<math>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z}</nowiki></code><br />
|<math>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g}</nowiki></code><br />
|<math>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m}</nowiki></code><br />
|<math>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t}</nowiki></code><br />
|<math>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z}</nowiki></code><br />
|<math>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4}</nowiki></code><br />
|<math>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}</nowiki></code><br />
|<math>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}\,\!</math><br />
|-<br />
! colspan="2" | Boldface (greek)<br />
|-<br />
|<code><nowiki>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta}</nowiki></code><br />
|<math>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}</nowiki></code><br />
|<math>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}</nowiki></code><br />
|<math>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}</nowiki></code><br />
|<math>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}</nowiki></code><br />
|<math>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}</nowiki></code><br />
|<math>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}</nowiki></code><br />
|<math>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}</nowiki></code><br />
|<math>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa}</nowiki></code><br />
|<math>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}</nowiki></code><br />
|<math>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}\,\!</math><br />
|-<br />
! colspan="2" | Italics<br />
|-<br />
|<code><nowiki>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G}</nowiki></code><br />
|<math>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M}</nowiki></code><br />
|<math>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T}</nowiki></code><br />
|<math>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z}</nowiki></code><br />
|<math>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g}</nowiki></code><br />
|<math>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m}</nowiki></code><br />
|<math>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t}</nowiki></code><br />
|<math>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z}</nowiki></code><br />
|<math>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4}</nowiki></code><br />
|<math>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}</nowiki></code><br />
|<math>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}\,\!</math><br />
|-<br />
! colspan="2" | Roman typeface<br />
|-<br />
|<code><nowiki>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G}</nowiki></code><br />
|<math>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M}</nowiki></code><br />
|<math>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T}</nowiki></code><br />
|<math>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z}</nowiki></code><br />
|<math>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}</nowiki></code><br />
|<math>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}\,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m}</nowiki></code><br />
|<math>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t}</nowiki></code><br />
|<math>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z}</nowiki></code><br />
|<math>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4}</nowiki></code><br />
|<math>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}</nowiki></code><br />
|<math>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}\,\!</math><br />
|-<br />
! colspan="2" | Fraktur typeface<br />
|-<br />
|<code><nowiki>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G}</nowiki></code><br />
|<math>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M}</nowiki></code><br />
|<math>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T}</nowiki></code><br />
|<math>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z}</nowiki></code><br />
|<math>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g}</nowiki></code><br />
|<math>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m}</nowiki></code><br />
|<math>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t}</nowiki></code><br />
|<math>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z}</nowiki></code><br />
|<math>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4}</nowiki></code><br />
|<math>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}</nowiki></code><br />
|<math>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}\,\!</math><br />
|-<br />
! colspan="2" | Calligraphy/Script<br />
|-<br />
|<code><nowiki>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G}</nowiki></code><br />
|<math>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M}</nowiki></code><br />
|<math>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T}</nowiki></code><br />
|<math>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}</nowiki></code><br />
|<math>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}\,\!</math><br />
|-<br />
! colspan="2" | Hebrew<br />
|-<br />
|<code><nowiki>\aleph \beth \gimel \daleth</nowiki></code><br />
|<math>\aleph \beth \gimel \daleth\,\!</math><br />
|}<br />
<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th colspan="2">How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>non-italicised characters</td><br />
<td>\mbox{abc}</td><br />
<td><math>\mbox{abc}</math></td><br />
<td><math>\mbox{abc} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (bad)</td><br />
<td>\mbox{if} n \mbox{is even}</td><br />
<td><math>\mbox{if} n \mbox{is even}</math></td><br />
<td><math>\mbox{if} n \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (good)</td><br />
<td>\mbox{if }n\mbox{ is even}</td><br />
<td><math>\mbox{if }n\mbox{ is even}</math></td><br />
<td><math>\mbox{if }n\mbox{ is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (more legible: ~ is a non-breaking space, while "\ " forces a space)</td><br />
<td>\mbox{if}~n\ \mbox{is even}</td><br />
<td><math>\mbox{if}~n\ \mbox{is even}</math></td><br />
<td><math>\mbox{if}~n\ \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
</table><br />
<br />
== Color ==<br />
<br />
Equations can use color:<br />
<br />
*<code>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</code><br />
*:<math>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</math><br />
<br />
*<code>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</code><br />
*:<math>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</math><br />
<br />
See here for [http://oregonstate.edu/%7Epeterseb/tex/samples/docs/color-package-demo.pdf all named colors] supported by LaTeX.<br />
<br />
Note that color should not be used as the ''only'' way to identify something, because it will become meaningless on black-and-white media or for color-blind people. See [[en:Wikipedia:Manual of Style#Color coding]].<br />
<br />
== Formatting issues ==<br />
=== Spacing ===<br />
Note that TeX handles most spacing automatically, but you may sometimes want manual control. <br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>double quad space</td><br />
<td>a \qquad b</td><br />
<td><math>a \qquad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>quad space</td><br />
<td>a \quad b</td><br />
<td><math>a \quad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space</td><br />
<td>a\ b</td><br />
<td><math>a\ b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space without PNG conversion</td><br />
<td>a \mbox{ } b</td><br />
<td><math>a \mbox{ } b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>large space</td><br />
<td>a\;b</td><br />
<td><math>a\;b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>medium space</td><br />
<td>a\&gt;b</td><br />
<td>[not supported]</td><br />
</tr><br />
<br />
<tr><br />
<td>small space</td><br />
<td>a\,b</td><br />
<td><math>a\,b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>no space</td><br />
<td>ab</td><br />
<td><math>ab\,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>small negative space</td><br />
<td>a\!b</td><br />
<td><math>a\!b</math></td><br />
</tr><br />
<br />
</table><br />
<br />
=== Alignment with normal text flow ===<br />
Due to the default css<br />
<br />
<pre>img.tex { vertical-align: middle; }</pre><br />
<br />
an inline expression like <math>\int_{-N}^{N} e^x\, dx</math> should look good.<br />
<br />
If you need to align it otherwise, use <code><nowiki><math style="vertical-align:-100%;">...</math></nowiki></code> and play with the <code>vertical-align</code> argument until you get it right; however, how it looks may depend on the browser and the browser settings.<br />
<br />
Also note that if you rely on this workaround, if/when the rendering on the server gets fixed in future releases, as a result of this extra manual offset your formulae will suddenly be aligned incorrectly. So use it sparingly, if at all.<br />
<br />
=== Forced PNG rendering ===<br />
<br />
To force the formula to render as PNG, add <code>\,</code> (small space) at the end of the formula (where it is not rendered). This will force PNG if the user is in "HTML if simple" mode, but not for "HTML if possible" mode.<br />
<br />
You can also use <code>\,\!</code> (small space and negative space, which cancel out) anywhere inside the math tags. This ''does'' force PNG even in "HTML if possible" mode, unlike <code>\,</code>.<br />
<br />
This could be useful to keep the rendering of formulae in a proof consistent, for example, or to fix formulae that render incorrectly in HTML (at one time, a^{2+2} rendered with an extra underscore), or to demonstrate how something is rendered when it would normally show up as HTML (as in the examples above).<br />
<br />
For instance:<br />
<br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2}</td><br />
<td><math>a^{c+2}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2} \,</td><br />
<td><math>a^{c+2} \,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{\,\!c+2}</td><br />
<td><math>a^{\,\!c+2}</math> </td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}</td><br />
<td><math>a^{b^{c+2}}</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}} \,</td><br />
<td><math>a^{b^{c+2}} \,</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}\approx 5</td><br />
<td><math>a^{b^{c+2}}\approx 5</math> (due to "<math>\approx</math>" correctly displayed, no code "\,\!" needed)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{\,\!c+2}}</td><br />
<td><math>a^{b^{\,\!c+2}}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>\int_{-N}^{N} e^x\, dx</td><br />
<td><math>\int_{-N}^{N} e^x\, dx</math></td><br />
</tr><br />
<br />
</table><br />
<br />
<br />
This has been tested with most of the formulae on this page, and seems to work perfectly.<br />
<br />
You might want to include a comment in the HTML so people don't "correct" the formula by removing it:<br />
<br />
:''<nowiki><!-- The \,\! is to keep the formula rendered as PNG instead of HTML. Please don't remove it.--></nowiki>''<br />
<br />
<br />
== Examples ==<br />
<br />
<center><br />
===Quadratic Polynomial===<br />
<math>ax^2 + bx + c = 0</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0</math></nowiki><br />
<br />
===Quadratic Polynomial (Force PNG Rendering)===<br />
<math>ax^2 + bx + c = 0\,\!</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0\,\!</math></nowiki><br />
<br />
===Quadratic Formula===<br />
<math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math><br />
<br />
<nowiki><math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math></nowiki><br />
<br />
===Tall Parentheses and Fractions ===<br />
<math>2 = \left( \frac{\left(3-x\right) \times 2}{3-x} \right)</math><br />
<br />
<nowiki><math>2 = \left(<br />
\frac{\left(3-x\right) \times 2}{3-x}<br />
\right)</math></nowiki><br />
<br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
<nowiki><br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
</nowiki><br />
<br />
===Integrals===<br />
<math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds = \int_a^x f(y)(x-y)\,dy</math><br />
<br />
<nowiki><math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds<br />
= \int_a^x f(y)(x-y)\,dy</math></nowiki><br />
<br />
===Summation===<br />
<math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}{3^m\left(m\,3^n+n\,3^m\right)}</math><br />
<br />
<nowiki><math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}<br />
{3^m\left(m\,3^n+n\,3^m\right)}</math></nowiki><br />
<br />
=== Differential Equation ===<br />
<math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math><br />
<br />
<nowiki><math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math></nowiki><br />
<br />
===Complex numbers===<br />
<math>|\bar{z}| = |z|, |(\bar{z})^n| = |z|^n, \arg(z^n) = n \arg(z)</math><br />
<br />
<nowiki><math>|\bar{z}| = |z|,<br />
|(\bar{z})^n| = |z|^n,<br />
\arg(z^n) = n \arg(z)</math></nowiki><br />
<br />
===Limits===<br />
<math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math><br />
<br />
<nowiki><math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math></nowiki><br />
<br />
===Integral Equation===<br />
<math>\phi_n(\kappa)<br />
= \frac{1}{4\pi^2\kappa^2} \int_0^\infty \frac{\sin(\kappa R)}{\kappa R} \frac{\partial}{\partial R} \left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math><br />
<br />
<nowiki><math>\phi_n(\kappa) =<br />
\frac{1}{4\pi^2\kappa^2} \int_0^\infty<br />
\frac{\sin(\kappa R)}{\kappa R}<br />
\frac{\partial}{\partial R}<br />
\left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math></nowiki><br />
<br />
===Example===<br />
<math>\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3},\quad \frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math><br />
<br />
<nowiki><math>\phi_n(\kappa) = <br />
0.033C_n^2\kappa^{-11/3},\quad<br />
\frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math></nowiki><br />
<br />
===Continuation and cases===<br />
<math>f(x) = \begin{cases}1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\ 1 - x^2 & \mbox{otherwise}\end{cases}</math><br />
<br />
<nowiki><math><br />
f(x) =<br />
\begin{cases}<br />
1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\<br />
1 - x^2 & \mbox{otherwise}<br />
\end{cases}<br />
</math></nowiki><br />
<br />
===Prefixed subscript===<br />
<math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z) = \sum_{n=0}^\infty \frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}\frac{z^n}{n!}</math><br />
<br />
<nowiki> <math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z)<br />
= \sum_{n=0}^\infty<br />
\frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}<br />
\frac{z^n}{n!}</math></nowiki><br />
<br />
===Fraction and small fraction===<br />
<math> \frac {a}{b}</math> &emsp; <math> \tfrac {a}{b} </math><br />
<nowiki><math> \frac {a}{b}\ \tfrac {a}{b} </math></nowiki><br />
<br />
</center><br />
<br />
===Unicode vs TeX comparison===<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 255pt; border-collapse: collapse;" width="340"> <br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; width: 48pt; height: 12.75pt; background-color: transparent;" width="64">unicode</td><br />
<td style="border: medium none #f0f0f0; width: 104pt; background-color: transparent;" width="139">TeX</td><br />
<td style="border: medium none #f0f0f0; width: 103pt; background-color: transparent;" width="137">See</td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">[\![</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>[\![</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\{</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\{</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\|</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\|</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\}</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\}</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\aleph</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\aleph</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">α</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\alpha</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\alpha</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨿</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\amalg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\amalg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\angle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\angle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ast</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ast</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≍</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">\</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\backslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\backslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">β</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\beta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\beta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcirc</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcirc</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigodot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigodot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigoplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigoplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigotimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigotimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigsqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigsqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangledown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangledown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangleup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangleup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\biguplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\biguplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigwedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigwedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigvee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigvee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bowtie</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bowtie</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">□</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Box</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Box</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bullet</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bullet</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">χ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\chi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\chi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\circ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\circ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\clubsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\clubsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\coprod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\coprod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">†</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dashv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dashv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">‡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamondsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamondsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">÷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\div</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\div</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\doteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\doteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℓ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ell</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ell</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\emptyset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\emptyset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\epsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\epsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">η</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\eta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\eta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\exists</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\exists</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\flat</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\flat</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\forall</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\forall</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\frown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\frown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gets</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gets</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℏ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hbar</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hbar</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\heartsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\heartsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Im</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Im</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ı</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\imath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\imath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\in</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\in</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∞</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\infty</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\infty</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\int</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\int</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ι</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\iota</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\iota</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">j</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\jmath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\jmath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">κ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\kappa</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\kappa</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\land</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\land</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle\!\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle\!\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">[</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\le</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\le</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌊</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ll</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ll</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lnot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lnot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟸</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟵</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longmapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longmapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟹</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟶</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mid</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mid</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\models</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\models</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">μ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nabla</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nabla</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\natural</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\natural</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ne</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ne</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nearrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nearrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ni</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ni</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≰</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not=</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not=</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ν</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nwarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nwarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\odot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\odot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oint</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oint</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ominus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ominus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\otimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\otimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\parallel</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\parallel</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\partial</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\partial</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\perp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\perp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϕ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">±</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pm</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pm</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">′</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prime</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prime</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∝</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\propto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\propto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle\!\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle\!\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">]</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℜ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Re</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Re</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ρ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇌</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightleftharpoons</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightleftharpoons</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\searrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\searrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\setminus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\setminus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sharp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sharp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\smile</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\smile</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\spadesuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\spadesuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\star</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\star</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≻</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sum</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sum</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">√</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\surd</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\surd</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\swarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\swarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">τ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\tau</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\tau</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">×</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\times</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\times</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\to</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\to</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\top</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\top</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleleft</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleleft</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleright</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleright</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊎</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ε</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varepsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varepsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varphi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varphi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϖ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varpi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varpi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϱ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varrho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varrho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ς</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varsigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varsigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vartheta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vartheta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">℘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wr</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wr</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ζ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\zeta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\zeta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">]\!]</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>]\!]</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ο</td><br />
<td style="background-color: transparent; border: #f0f0f0;">o</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>o</math></td><br />
</tr><br />
</table></div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:MediaWiki_TeX_test&diff=82759
Development:MediaWiki TeX test
2011-04-14T16:44:52Z
<p>Stronk7: </p>
<hr />
<div>This should look like some maths:<br />
<br />
<math>\int_{-\infty}^\infty jordan^{-x^{tim}}\,dx = \sqrt{hunt^4}</math><br />
<br />
(This page was created for the benefit of MDLSITE-649.)<br />
<br />
Heavy test:<br />
<br />
== Functions, symbols, special characters ==<br />
<br />
<!-- Eight symbols per line seems to be optimal--><br />
{| class="wikitable"<br />
! colspan="2" |<h3>Accents/Diacritics</h3><br />
|-<br />
|<code>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}</code><br />
|<math>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}\,\!</math><br />
|-<br />
|<code>\check{a} \bar{a} \ddot{a} \dot{a}</code><br />
|<math>\check{a} \bar{a} \ddot{a} \dot{a}\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Standard functions</h3><br />
|-<br />
|<code>\sin a \cos b \tan c</code><br />
|<math>\sin a \cos b \tan c\!</math><br />
|-<br />
|<code>\sec d \csc e \cot f</code><br />
|<math>\sec d \csc e \cot f\,\!</math><br />
|-<br />
|<code>\arcsin h \arccos i \arctan j</code><br />
|<math>\arcsin h \arccos i \arctan j\,\!</math><br />
|-<br />
|<code>\sinh k \cosh l \tanh m \coth n\!</code><br />
|<math>\sinh k \cosh l \tanh m \coth n\!</math><br />
|-<br />
|<code>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</code><br />
|<math>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</math><br />
|-<br />
|<code>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t</code><br />
|<math>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t\,\!</math><br />
|-<br />
|<code>\lim u \limsup v \liminf w \min x \max y\!</code><br />
|<math>\lim u \limsup v \liminf w \min x \max y\!</math><br />
|-<br />
|<code>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</code><br />
|<math>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</math><br />
|-<br />
|<code>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n</code><br />
|<math>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Modular arithmetic</h3><br />
|-<br />
|<code>s_k \equiv 0 \pmod{m}</code><br />
|<math>s_k \equiv 0 \pmod{m}\,\!</math><br />
|-<br />
|<code>a\,\bmod\,b</code><br />
|<math>a\,\bmod\,b\,\!</math><br />
|-<br />
! colspan="2" | <h3>Derivatives</h3><br />
|-<br />
|<code>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</code><br />
|<math>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Sets</h3><br />
|-<br />
|<code>\forall \exists \empty \emptyset \varnothing</code><br />
|<math>\forall \exists \empty \emptyset \varnothing\,\!</math><br />
|-<br />
|<code>\in \ni \not \in \notin \subset \subseteq \supset \supseteq</code><br />
|<math>\in \ni \not \in \notin \subset \subseteq \supset \supseteq\,\!</math><br />
|-<br />
|<code>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus</code><br />
|<math>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus\,\!</math><br />
|-<br />
|<code>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup</code><br />
|<math>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Operators</h3><br />
|-<br />
|<code>+ \oplus \bigoplus \pm \mp - </code><br />
|<math>+ \oplus \bigoplus \pm \mp - \,\!</math><br />
|-<br />
|<code>\times \otimes \bigotimes \cdot \circ \bullet \bigodot</code><br />
|<math>\times \otimes \bigotimes \cdot \circ \bullet \bigodot\,\!</math><br />
|-<br />
|<code>\star * / \div \frac{1}{2}</code><br />
|<math>\star * / \div \frac{1}{2}\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Logic</h3><br />
|-<br />
|<code>\land (or \and) \wedge \bigwedge \bar{q} \to p</code><br />
|<math>\land \wedge \bigwedge \bar{q} \to p\,\!</math><br />
|-<br />
|<code>\lor \vee \bigvee \lnot \neg q \And</code><br />
|<math>\lor \vee \bigvee \lnot \neg q \And\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Root</h3><br />
|-<br />
|<code>\sqrt{2} \sqrt[n]{x}</code><br />
|<math>\sqrt{2} \sqrt[n]{x}\,\!</math><br />
|-<br />
! colspan="2" | <h3>Relations</h3><br />
|-<br />
|<code>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}</code><br />
|<math>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}\,\!</math><br />
|-<br />
|<code>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto</code><br />
|<math>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Geometric</h3><br />
|-<br />
|<code><nowiki>\Diamond \Box \triangle \angle \perp \mid \nmid \| 45^\circ</nowiki></code><br />
|<math>\Diamond \, \Box \, \triangle \, \angle \perp \, \mid \; \nmid \, \| 45^\circ\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Arrows</h3><br />
|-<br />
|<code>\leftarrow (or \gets) \rightarrow (or \to) \nleftarrow \nrightarrow \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow</code><br />
|<math>\leftarrow \rightarrow \nleftarrow \not\to \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow \,\!</math><br />
|-<br />
|<code>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow (or \iff)</code><br />
|<math>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow \!</math><br />
|-<br />
|<code>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow</code><br />
|<math>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow \!</math><br />
|-<br />
|<code>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons</code><br />
|<math>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons \,\!</math><br />
|-<br />
|<code>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright</code><br />
|<math>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright \,\!</math><br />
|-<br />
|<code>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft</code><br />
|<math>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft \,\!</math><br />
|-<br />
|<code>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow </code><br />
|<math>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow \,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Special</h3><br />
|-<br />
|<code>\And \eth \S \P \% \dagger \ddagger \ldots \cdots</code><br />
|<math>\And \eth \S \P \% \dagger \ddagger \ldots \cdots\,\!</math><br />
|-<br />
|<code>\smile \frown \wr \triangleleft \triangleright \infty \bot \top</code><br />
|<math>\smile \frown \wr \triangleleft \triangleright \infty \bot \top\,\!</math><br />
|-<br />
|<code>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar</code><br />
|<math>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar\,\!</math><br />
|-<br />
|<code>\ell \mho \Finv \Re \Im \wp \complement</code><br />
|<math>\ell \mho \Finv \Re \Im \wp \complement\,\!</math><br />
|-<br />
|<code>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp</code><br />
|<math>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Unsorted (new stuff)</h3><br />
|-<br />
|<code> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</code><br />
|<math> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</math><br />
|-<br />
|<code> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge</code><br />
|<math> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge\!</math><br />
|-<br />
|<code> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</code><br />
|<math> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</math><br />
|-<br />
|<code> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</code><br />
|<math> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</math><br />
|-<br />
|<code> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</code><br />
|<math> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</math><br />
|-<br />
|<code> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</code><br />
|<math> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</math><br />
|-<br />
|<code> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</code><br />
|<math> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</math><br />
|-<br />
|<code> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</code><br />
|<math> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</math><br />
|-<br />
|<code> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</code><br />
|<math> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</math><br />
|-<br />
|<code> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</code><br />
|<math> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</math><br />
|-<br />
|<code> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</code><br />
|<math> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</math><br />
|-<br />
|<code> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</code><br />
|<math> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</math><br />
|-<br />
|<code>\subsetneq</code><br />
|<math>\subsetneq</math><br />
|-<br />
|<code> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</code><br />
|<math> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</math><br />
|-<br />
|<code> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</code><br />
|<math> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</math><br />
|-<br />
|<code> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</code><br />
|<math> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</math><br />
|-<br />
|<code>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus</code><br />
|<math>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus\,\!</math><br />
|-<br />
|<code>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq</code><br />
|<math>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq\,\!</math><br />
|-<br />
|<code>\dashv \asymp \doteq \parallel</code><br />
|<math>\dashv \asymp \doteq \parallel\,\!</math><br />
|-<br />
|<code>\ulcorner \urcorner \llcorner \lrcorner</code><br />
|<math>\ulcorner \urcorner \llcorner \lrcorner</math><br />
|}<br />
<br />
== Larger Expressions ==<br />
=== Subscripts, superscripts, integrals ===<br />
{| border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"<br />
!rowspan="2"|Feature!!rowspan="2"|Syntax!!colspan="2"|How it looks rendered<br />
|-<br />
!HTML!!PNG<br />
|-<br />
|-<br />
|Superscript||<code>a^2</code>||<math>a^2</math>||<math>a^2 \,\!</math><br />
|-<br />
|Subscript||<code>a_2</code>||<math>a_2</math>||<math>a_2 \,\!</math><br />
|-<br />
|rowspan=2|Grouping||<code>a^{2+2}</code>||<math>a^{2+2}</math>||<math>a^{2+2}\,\!</math><br />
|-<br />
|<code>a_{i,j}</code>||<math>a_{i,j}</math>||<math>a_{i,j}\,\!</math><br />
|-<br />
|rowspan=2|Combining sub & super without and with horizontal separation||<code>x_2^3</code>||<math>x_2^3</math>||<math>x_2^3 \,\!</math><br />
|-<br />
|<code>{x_2}^3</code>||<math>{x_2}^3</math>||<math>{x_2}^3 \,\!</math><br />
|-<br />
|Super super||<code>10^{10^{ \,\!{8} }</code>||colspan=2|<math>10^{10^{ \,\! 8 } }</math><br />
|-<br />
|Super super||<code>10^{10^{ \overset{8}{} }}</code>||colspan=2|<math>10^{10^{ \overset{8}{} }}</math><br />
|-<br />
|Super super (wrong in HTML in some browsers)||<code>10^{10^8}</code> ||colspan=2|<math>10^{10^8}</math><br />
|-<br />
|rowspan="2"|Preceding and/or Additional sub & super||<code>\sideset{_1^2}{_3^4}\prod_a^b</code>||colspan=2|<math>\sideset{_1^2}{_3^4}\prod_a^b</math><br />
|-<br />
|<code>{}_1^2\!\Omega_3^4</code>||colspan=2|<math>{}_1^2\!\Omega_3^4</math><br />
|-<br />
|rowspan="4"|Stacking<br />
|<code>\overset{\alpha}{\omega}</code>||colspan="2"|<math>\overset{\alpha}{\omega}</math><br />
|-<br />
|<code>\underset{\alpha}{\omega}</code>||colspan="2"|<math>\underset{\alpha}{\omega}</math><br />
|-<br />
|<code>\overset{\alpha}{\underset{\gamma}{\omega}}</code>||colspan="2"|<math>\overset{\alpha}{\underset{\gamma}{\omega}}</math><br />
|-<br />
|<code>\stackrel{\alpha}{\omega}</code>||colspan="2"|<math>\stackrel{\alpha}{\omega}</math><br />
|-<br />
|Derivative (forced PNG)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki>\!</code>||&nbsp;||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (f in italics may overlap primes in HTML)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki></code>||<math>x', y'', f', f''</math>||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (wrong in HTML)||<code>x^\prime, y^{\prime\prime}</code>||<math>x^\prime, y^{\prime\prime}</math>||<math>x^\prime, y^{\prime\prime}\,\!</math><br />
|-<br />
|Derivative (wrong in PNG)||<code>x\prime, y\prime\prime</code>||<math>x\prime, y\prime\prime</math>||<math>x\prime, y\prime\prime\,\!</math><br />
|-<br />
|Derivative dots||<code>\dot{x}, \ddot{x}</code>||colspan=2|<math>\dot{x}, \ddot{x}</math><br />
|-<br />
|rowspan="3"|Underlines, overlines, vectors||<code>\hat a \ \bar b \ \vec c</code>||colspan=2|<math>\hat a \ \bar b \ \vec c</math><br />
|-<br />
|<code>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</code>||colspan=2|<math>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</math><br />
|-<br />
|<code>\overline{g h i} \ \underline{j k l}</code>||colspan=2|<math>\overline{g h i} \ \underline{j k l}</math><br />
|-<br />
|Arrows||<code> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</code>||colspan=2|<math> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</math><br />
|-<br />
|Overbraces||<code>\overbrace{ 1+2+\cdots+100 }^{5050}</code>||colspan=2|<math>\overbrace{ 1+2+\cdots+100 }^{5050}</math><br />
|-<br />
|Underbraces||<code>\underbrace{ a+b+\cdots+z }_{26}</code>||colspan=2|<math>\underbrace{ a+b+\cdots+z }_{26}</math><br />
|-<br />
|Sum||<code>\sum_{k=1}^N k^2</code>||colspan=2|<math>\sum_{k=1}^N k^2</math><br />
|-<br />
|Sum (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \sum_{k=1}^N k^2 </code>||colspan=2|<math>\textstyle \sum_{k=1}^N k^2</math><br />
|-<br />
|Product||<code>\prod_{i=1}^N x_i</code>||colspan=2|<math>\prod_{i=1}^N x_i</math><br />
|-<br />
|Product (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \prod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \prod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct||<code>\coprod_{i=1}^N x_i</code>||colspan=2|<math>\coprod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \coprod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \coprod_{i=1}^N x_i</math><br />
|-<br />
|Limit||<code>\lim_{n \to \infty}x_n</code>||colspan=2|<math>\lim_{n \to \infty}x_n</math><br />
|-<br />
|Limit (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \lim_{n \to \infty}x_n</code>||colspan=2|<math>\textstyle \lim_{n \to \infty}x_n</math><br />
|-<br />
|Integral||<code>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (alternate limits style)||<code>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \int\limits_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int\limits_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>, alternate limits style)||<code>\textstyle \int_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Double integral||<code>\iint\limits_D \, dx\,dy</code>||colspan=2|<math>\iint\limits_D \, dx\,dy</math><br />
|-<br />
|Triple integral||<code>\iiint\limits_E \, dx\,dy\,dz</code>||colspan=2|<math>\iiint\limits_E \, dx\,dy\,dz</math><br />
|-<br />
|Quadruple integral||<code>\iiiint\limits_F \, dx\,dy\,dz\,dt</code>||colspan=2|<math>\iiiint\limits_F \, dx\,dy\,dz\,dt</math><br />
|-<br />
|Line or path integral||<code>\int_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\int_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Closed line or path integral||<code>\oint_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\oint_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Intersections||<code>\bigcap_1^n p</code>||colspan=2|<math>\bigcap_1^n p</math><br />
|-<br />
|Unions||<code>\bigcup_1^k p</code>||colspan=2|<math>\bigcup_1^k p</math><br />
|}<br />
<br />
=== Fractions, matrices, multilines ===<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>Fractions</td><br />
<td><code>\frac{2}{4}=0.5</code></td><br />
<td><math>\frac{2}{4}=0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Small Fractions</td><br />
<td><code>\tfrac{2}{4} = 0.5</code></td><br />
<td><math>\tfrac{2}{4} = 0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (normal) Fractions</td><br />
<td><code>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a </code></td><br />
<td><math>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (nested) Fractions</td><br />
<td><code>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</code></td><br />
<td><math>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Binomial coefficients</td><br />
<td><code>\binom{n}{k}</code></td><br />
<td><math>\binom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Small Binomial coefficients</td><br />
<td><code>\tbinom{n}{k}</code></td><br />
<td><math>\tbinom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Large (normal) Binomial coefficients</td><br />
<td><code>\dbinom{n}{k}</code></td><br />
<td><math>\dbinom{n}{k}</math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="7">Matrices</td><br />
<td><pre>\begin{matrix}<br />
x & y \\<br />
z & v <br />
\end{matrix}</pre></td><br />
<td><math>\begin{matrix} x & y \\ z & v<br />
\end{matrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{vmatrix}<br />
x & y \\<br />
z & v <br />
\end{vmatrix}</pre></td><br />
<td><math>\begin{vmatrix} x & y \\ z & v<br />
\end{vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Vmatrix}<br />
x & y \\<br />
z & v<br />
\end{Vmatrix}</pre></td><br />
<td><math>\begin{Vmatrix} x & y \\ z & v<br />
\end{Vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{bmatrix}<br />
0 & \cdots & 0 \\<br />
\vdots & \ddots & \vdots \\ <br />
0 & \cdots & 0<br />
\end{bmatrix}</pre></td><br />
<td><math>\begin{bmatrix} 0 & \cdots & 0 \\ \vdots<br />
& \ddots & \vdots \\ 0 & \cdots &<br />
0\end{bmatrix} </math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Bmatrix}<br />
x & y \\<br />
z & v<br />
\end{Bmatrix}</pre></td><br />
<td><math>\begin{Bmatrix} x & y \\ z & v<br />
\end{Bmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{pmatrix}<br />
x & y \\<br />
z & v <br />
\end{pmatrix}</pre></td><br />
<td><math>\begin{pmatrix} x & y \\ z & v<br />
\end{pmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</pre></td><br />
<td><math><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</math></td><br />
</tr><br />
<br />
<br />
<br />
<tr><br />
<td>Case distinctions</td><br />
<td><pre><br />
f(n) = <br />
\begin{cases} <br />
n/2, & \mbox{if }n\mbox{ is even} \\<br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases}</pre></td><br />
<td><math>f(n) = <br />
\begin{cases}<br />
n/2, & \mbox{if }n\mbox{ is even} \\ <br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases} </math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="2">Multiline equations</td><br />
<td><pre><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</pre></td><br />
<td><math><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</pre></td><br />
<td><math><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</math></td><br />
</tr><br />
<tr><br />
<td>Multiline equations <small>(must define number of colums used ({lcr}) <small>(should not be used unless needed)</small></small></td><br />
<td><pre><br />
\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Multiline equations (more)</td><br />
<td><pre><br />
\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Breaking up a long expression so that it wraps when necessary, at the expense of destroying correct spacing</td><br />
<td><pre><br />
<nowiki><br />
<math>f(x) \,\!</math><br />
<math>= \sum_{n=0}^\infty a_n x^n </math><br />
<math>= a_0+a_1x+a_2x^2+\cdots</math><br />
</nowiki><br />
</pre><br />
</td><br />
<td><br />
<math>f(x) \,\!</math><math>= \sum_{n=0}^\infty a_n x^n </math><math>= a_0 +a_1x+a_2x^2+\cdots</math><br />
</td><br />
</tr><br />
<br />
<tr><br />
<td>Simultaneous equations</td><br />
<td><pre>\begin{cases}<br />
3x + 5y + z \\<br />
7x - 2y + 4z \\<br />
-6x + 3y + 2z <br />
\end{cases}</pre></td><br />
<td><math>\begin{cases} 3x + 5y + z \\ 7x - 2y + 4z \\ -6x + 3y + 2z \end{cases}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Arrays</td><br />
<td><pre><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</pre></td><br />
<td><math><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</math></td><br />
</tr><br />
</table><br />
<br />
=== Parenthesizing big expressions, brackets, bars ===<br />
{| class="wikitable"<br />
! Feature !! Syntax !! How it looks rendered<br />
|-<br />
| Bad<br />
| <code>( \frac{1}{2} )</code><br />
| <math>( \frac{1}{2} )</math><br />
|-<br />
| Good<br />
| <code>\left ( \frac{1}{2} \right )</code><br />
| <math>\left ( \frac{1}{2} \right )</math><br />
|}<br />
<br />
You can use various delimiters with \left and \right: <br />
<br />
{| class="wikitable"<br />
! Feature<br />
! Syntax<br />
! How it looks rendered<br />
|-<br />
| Parentheses<br />
| <code>\left ( \frac{a}{b} \right )</code><br />
| <math>\left ( \frac{a}{b} \right )</math><br />
|-<br />
| Brackets<br />
| <code>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</code><br />
| <math>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</math><br />
|-<br />
| Braces<br />
| <code>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</code><br />
| <math>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</math><br />
|-<br />
| Angle brackets<br />
| <code>\left \langle \frac{a}{b} \right \rangle</code><br />
| <math>\left \langle \frac{a}{b} \right \rangle</math><br />
|-<br />
| Bars and double bars<br />
| <code><nowiki>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</nowiki></code><br />
| <math>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</math><br />
|-<br />
| Floor and ceiling functions:<br />
| <code>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</code><br />
| <math>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</math><br />
|-<br />
| Slashes and backslashes<br />
| <code>\left / \frac{a}{b} \right \backslash</code><br />
| <math>\left / \frac{a}{b} \right \backslash</math><br />
|-<br />
| Up, down and up-down arrows<br />
| <code>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</code><br />
| <math>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</math><br />
|-<br />
| Delimiters can be mixed,<br/>as long as \left and \right match<br />
| <code><nowiki>\left [ 0,1 \right )</code> <br/> <code>\left \langle \psi \right |</nowiki></code><br />
| <math>\left [ 0,1 \right )</math> <br/> <math>\left \langle \psi \right |</math><br />
|-<br />
| Use \left. and \right. if you don't<br/>want a delimiter to appear:<br />
| <code>\left . \frac{A}{B} \right \} \to X</code><br />
| <math>\left . \frac{A}{B} \right \} \to X</math><br />
|-<br />
| rowspan="7" | Size of the delimiters<br />
| <code>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]/<code><br />
| <math>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]</math><br />
|-<br />
| <code>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</code><br />
| <math>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</math><br />
|-<br />
| <code><nowiki>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</nowiki></code><br />
| <math>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</math><br />
|-<br />
| <code>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</code><br />
| <math>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</math><br />
|-<br />
| <code>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</code><br />
| <math>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</math><br />
|-<br />
| <code>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</code><br />
| <math>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</math><br />
|-<br />
| <code>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</code><br />
| <math>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</math><br />
|}<br />
<br />
== Alphabets and typefaces == <br />
[[w:Texvc|Texvc]] cannot render arbitrary [[w:Unicode|Unicode]] characters. Those it can handle can be entered by the expressions below.<br />
For others, such as [[w:Cyrillic|Cyrillic]], they can be entered as Unicode or HTML entities in running text, but cannot be used in displayed formulas.<br />
<br />
{| class="wikitable"<br />
! colspan="2" | Greek alphabet<br />
|-<br />
|<code><nowiki>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta</nowiki></code><br />
|<math>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \,\!</math><br />
|-<br />
|<code><nowiki>\Eta \Theta \Iota \Kappa \Lambda \Mu</nowiki></code><br />
|<math>\Eta \Theta \Iota \Kappa \Lambda \Mu \,\!</math><br />
|-<br />
|<code><nowiki>\Nu \Xi \Pi \Rho \Sigma \Tau</nowiki></code><br />
|<math>\Nu \Xi \Pi \Rho \Sigma \Tau\,\!</math><br />
|-<br />
|<code><nowiki>\Upsilon \Phi \Chi \Psi \Omega</nowiki></code><br />
|<math>\Upsilon \Phi \Chi \Psi \Omega \,\!</math><br />
|-<br />
|<code><nowiki>\alpha \beta \gamma \delta \epsilon \zeta</nowiki></code><br />
|<math>\alpha \beta \gamma \delta \epsilon \zeta \,\!</math><br />
|-<br />
|<code><nowiki>\eta \theta \iota \kappa \lambda \mu</nowiki></code><br />
|<math>\eta \theta \iota \kappa \lambda \mu \,\!</math><br />
|-<br />
|<code><nowiki>\nu \xi \pi \rho \sigma \tau</nowiki></code><br />
|<math>\nu \xi \pi \rho \sigma \tau \,\!</math><br />
|-<br />
|<code><nowiki>\upsilon \phi \chi \psi \omega</nowiki></code><br />
|<math>\upsilon \phi \chi \psi \omega \,\!</math><br />
|-<br />
|<code><nowiki>\varepsilon \digamma \vartheta \varkappa</nowiki></code><br />
|<math>\varepsilon \digamma \vartheta \varkappa \,\!</math><br />
|-<br />
|<code><nowiki>\varpi \varrho \varsigma \varphi</nowiki></code><br />
|<math>\varpi \varrho \varsigma \varphi\,\!</math><br />
|-<br />
! colspan="2" | Blackboard Bold/Scripts<br />
|-<br />
|<code><nowiki>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G}</nowiki></code><br />
|<math>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M}</nowiki></code><br />
|<math>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T}</nowiki></code><br />
|<math>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}</nowiki></code><br />
|<math>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}\,\!</math><br />
|-<br />
! colspan="2" | boldface (vectors)<br />
|-<br />
|<code><nowiki>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G}</nowiki></code><br />
|<math>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M}</nowiki></code><br />
|<math>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T}</nowiki></code><br />
|<math>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z}</nowiki></code><br />
|<math>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g}</nowiki></code><br />
|<math>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m}</nowiki></code><br />
|<math>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t}</nowiki></code><br />
|<math>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z}</nowiki></code><br />
|<math>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4}</nowiki></code><br />
|<math>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}</nowiki></code><br />
|<math>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}\,\!</math><br />
|-<br />
! colspan="2" | Boldface (greek)<br />
|-<br />
|<code><nowiki>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta}</nowiki></code><br />
|<math>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}</nowiki></code><br />
|<math>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}</nowiki></code><br />
|<math>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}</nowiki></code><br />
|<math>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}</nowiki></code><br />
|<math>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}</nowiki></code><br />
|<math>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}</nowiki></code><br />
|<math>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}</nowiki></code><br />
|<math>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa}</nowiki></code><br />
|<math>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}</nowiki></code><br />
|<math>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}\,\!</math><br />
|-<br />
! colspan="2" | Italics<br />
|-<br />
|<code><nowiki>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G}</nowiki></code><br />
|<math>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M}</nowiki></code><br />
|<math>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T}</nowiki></code><br />
|<math>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z}</nowiki></code><br />
|<math>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g}</nowiki></code><br />
|<math>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m}</nowiki></code><br />
|<math>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t}</nowiki></code><br />
|<math>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z}</nowiki></code><br />
|<math>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4}</nowiki></code><br />
|<math>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}</nowiki></code><br />
|<math>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}\,\!</math><br />
|-<br />
! colspan="2" | Roman typeface<br />
|-<br />
|<code><nowiki>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G}</nowiki></code><br />
|<math>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M}</nowiki></code><br />
|<math>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T}</nowiki></code><br />
|<math>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z}</nowiki></code><br />
|<math>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}</nowiki></code><br />
|<math>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}\,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m}</nowiki></code><br />
|<math>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t}</nowiki></code><br />
|<math>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z}</nowiki></code><br />
|<math>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4}</nowiki></code><br />
|<math>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}</nowiki></code><br />
|<math>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}\,\!</math><br />
|-<br />
! colspan="2" | Fraktur typeface<br />
|-<br />
|<code><nowiki>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G}</nowiki></code><br />
|<math>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M}</nowiki></code><br />
|<math>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T}</nowiki></code><br />
|<math>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z}</nowiki></code><br />
|<math>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g}</nowiki></code><br />
|<math>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m}</nowiki></code><br />
|<math>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t}</nowiki></code><br />
|<math>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z}</nowiki></code><br />
|<math>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4}</nowiki></code><br />
|<math>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}</nowiki></code><br />
|<math>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}\,\!</math><br />
|-<br />
! colspan="2" | Calligraphy/Script<br />
|-<br />
|<code><nowiki>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G}</nowiki></code><br />
|<math>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M}</nowiki></code><br />
|<math>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T}</nowiki></code><br />
|<math>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}</nowiki></code><br />
|<math>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}\,\!</math><br />
|-<br />
! colspan="2" | Hebrew<br />
|-<br />
|<code><nowiki>\aleph \beth \gimel \daleth</nowiki></code><br />
|<math>\aleph \beth \gimel \daleth\,\!</math><br />
|}<br />
<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th colspan="2">How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>non-italicised characters</td><br />
<td>\mbox{abc}</td><br />
<td><math>\mbox{abc}</math></td><br />
<td><math>\mbox{abc} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (bad)</td><br />
<td>\mbox{if} n \mbox{is even}</td><br />
<td><math>\mbox{if} n \mbox{is even}</math></td><br />
<td><math>\mbox{if} n \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (good)</td><br />
<td>\mbox{if }n\mbox{ is even}</td><br />
<td><math>\mbox{if }n\mbox{ is even}</math></td><br />
<td><math>\mbox{if }n\mbox{ is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (more legible: ~ is a non-breaking space, while "\ " forces a space)</td><br />
<td>\mbox{if}~n\ \mbox{is even}</td><br />
<td><math>\mbox{if}~n\ \mbox{is even}</math></td><br />
<td><math>\mbox{if}~n\ \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
</table><br />
<br />
== Color ==<br />
<br />
Equations can use color:<br />
<br />
*<code>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</code><br />
*:<math>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</math><br />
<br />
*<code>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</code><br />
*:<math>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</math><br />
<br />
See here for [http://oregonstate.edu/%7Epeterseb/tex/samples/docs/color-package-demo.pdf all named colors] supported by LaTeX.<br />
<br />
Note that color should not be used as the ''only'' way to identify something, because it will become meaningless on black-and-white media or for color-blind people. See [[en:Wikipedia:Manual of Style#Color coding]].<br />
<br />
== Formatting issues ==<br />
=== Spacing ===<br />
Note that TeX handles most spacing automatically, but you may sometimes want manual control. <br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>double quad space</td><br />
<td>a \qquad b</td><br />
<td><math>a \qquad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>quad space</td><br />
<td>a \quad b</td><br />
<td><math>a \quad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space</td><br />
<td>a\ b</td><br />
<td><math>a\ b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space without PNG conversion</td><br />
<td>a \mbox{ } b</td><br />
<td><math>a \mbox{ } b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>large space</td><br />
<td>a\;b</td><br />
<td><math>a\;b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>medium space</td><br />
<td>a\&gt;b</td><br />
<td>[not supported]</td><br />
</tr><br />
<br />
<tr><br />
<td>small space</td><br />
<td>a\,b</td><br />
<td><math>a\,b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>no space</td><br />
<td>ab</td><br />
<td><math>ab\,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>small negative space</td><br />
<td>a\!b</td><br />
<td><math>a\!b</math></td><br />
</tr><br />
<br />
</table><br />
<br />
=== Alignment with normal text flow ===<br />
Due to the default css<br />
<br />
<pre>img.tex { vertical-align: middle; }</pre><br />
<br />
an inline expression like <math>\int_{-N}^{N} e^x\, dx</math> should look good.<br />
<br />
If you need to align it otherwise, use <code><nowiki><math style="vertical-align:-100%;">...</math></nowiki></code> and play with the <code>vertical-align</code> argument until you get it right; however, how it looks may depend on the browser and the browser settings.<br />
<br />
Also note that if you rely on this workaround, if/when the rendering on the server gets fixed in future releases, as a result of this extra manual offset your formulae will suddenly be aligned incorrectly. So use it sparingly, if at all.<br />
<br />
=== Forced PNG rendering ===<br />
<br />
To force the formula to render as PNG, add <code>\,</code> (small space) at the end of the formula (where it is not rendered). This will force PNG if the user is in "HTML if simple" mode, but not for "HTML if possible" mode.<br />
<br />
You can also use <code>\,\!</code> (small space and negative space, which cancel out) anywhere inside the math tags. This ''does'' force PNG even in "HTML if possible" mode, unlike <code>\,</code>.<br />
<br />
This could be useful to keep the rendering of formulae in a proof consistent, for example, or to fix formulae that render incorrectly in HTML (at one time, a^{2+2} rendered with an extra underscore), or to demonstrate how something is rendered when it would normally show up as HTML (as in the examples above).<br />
<br />
For instance:<br />
<br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2}</td><br />
<td><math>a^{c+2}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2} \,</td><br />
<td><math>a^{c+2} \,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{\,\!c+2}</td><br />
<td><math>a^{\,\!c+2}</math> </td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}</td><br />
<td><math>a^{b^{c+2}}</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}} \,</td><br />
<td><math>a^{b^{c+2}} \,</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}\approx 5</td><br />
<td><math>a^{b^{c+2}}\approx 5</math> (due to "<math>\approx</math>" correctly displayed, no code "\,\!" needed)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{\,\!c+2}}</td><br />
<td><math>a^{b^{\,\!c+2}}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>\int_{-N}^{N} e^x\, dx</td><br />
<td><math>\int_{-N}^{N} e^x\, dx</math></td><br />
</tr><br />
<br />
</table><br />
<br />
<br />
This has been tested with most of the formulae on this page, and seems to work perfectly.<br />
<br />
You might want to include a comment in the HTML so people don't "correct" the formula by removing it:<br />
<br />
:''<nowiki><!-- The \,\! is to keep the formula rendered as PNG instead of HTML. Please don't remove it.--></nowiki>''<br />
<br />
<br />
== Examples ==<br />
<br />
<center><br />
===Quadratic Polynomial===<br />
<math>ax^2 + bx + c = 0</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0</math></nowiki><br />
<br />
===Quadratic Polynomial (Force PNG Rendering)===<br />
<math>ax^2 + bx + c = 0\,\!</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0\,\!</math></nowiki><br />
<br />
===Quadratic Formula===<br />
<math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math><br />
<br />
<nowiki><math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math></nowiki><br />
<br />
===Tall Parentheses and Fractions ===<br />
<math>2 = \left( \frac{\left(3-x\right) \times 2}{3-x} \right)</math><br />
<br />
<nowiki><math>2 = \left(<br />
\frac{\left(3-x\right) \times 2}{3-x}<br />
\right)</math></nowiki><br />
<br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
<nowiki><br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
</nowiki><br />
<br />
===Integrals===<br />
<math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds = \int_a^x f(y)(x-y)\,dy</math><br />
<br />
<nowiki><math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds<br />
= \int_a^x f(y)(x-y)\,dy</math></nowiki><br />
<br />
===Summation===<br />
<math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}{3^m\left(m\,3^n+n\,3^m\right)}</math><br />
<br />
<nowiki><math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}<br />
{3^m\left(m\,3^n+n\,3^m\right)}</math></nowiki><br />
<br />
=== Differential Equation ===<br />
<math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math><br />
<br />
<nowiki><math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math></nowiki><br />
<br />
===Complex numbers===<br />
<math>|\bar{z}| = |z|, |(\bar{z})^n| = |z|^n, \arg(z^n) = n \arg(z)</math><br />
<br />
<nowiki><math>|\bar{z}| = |z|,<br />
|(\bar{z})^n| = |z|^n,<br />
\arg(z^n) = n \arg(z)</math></nowiki><br />
<br />
===Limits===<br />
<math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math><br />
<br />
<nowiki><math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math></nowiki><br />
<br />
===Integral Equation===<br />
<math>\phi_n(\kappa)<br />
= \frac{1}{4\pi^2\kappa^2} \int_0^\infty \frac{\sin(\kappa R)}{\kappa R} \frac{\partial}{\partial R} \left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math><br />
<br />
<nowiki><math>\phi_n(\kappa) =<br />
\frac{1}{4\pi^2\kappa^2} \int_0^\infty<br />
\frac{\sin(\kappa R)}{\kappa R}<br />
\frac{\partial}{\partial R}<br />
\left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math></nowiki><br />
<br />
===Example===<br />
<math>\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3},\quad \frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math><br />
<br />
<nowiki><math>\phi_n(\kappa) = <br />
0.033C_n^2\kappa^{-11/3},\quad<br />
\frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math></nowiki><br />
<br />
===Continuation and cases===<br />
<math>f(x) = \begin{cases}1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\ 1 - x^2 & \mbox{otherwise}\end{cases}</math><br />
<br />
<nowiki><math><br />
f(x) =<br />
\begin{cases}<br />
1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\<br />
1 - x^2 & \mbox{otherwise}<br />
\end{cases}<br />
</math></nowiki><br />
<br />
===Prefixed subscript===<br />
<math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z) = \sum_{n=0}^\infty \frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}\frac{z^n}{n!}</math><br />
<br />
<nowiki> <math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z)<br />
= \sum_{n=0}^\infty<br />
\frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}<br />
\frac{z^n}{n!}</math></nowiki><br />
<br />
===Fraction and small fraction===<br />
<math> \frac {a}{b}</math> &emsp; <math> \tfrac {a}{b} </math><br />
<nowiki><math> \frac {a}{b}\ \tfrac {a}{b} </math></nowiki><br />
<br />
</center><br />
<br />
===Unicode vs TeX comparison===<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 255pt; border-collapse: collapse;" width="340"> <br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; width: 48pt; height: 12.75pt; background-color: transparent;" width="64">unicode</td><br />
<td style="border: medium none #f0f0f0; width: 104pt; background-color: transparent;" width="139">TeX</td><br />
<td style="border: medium none #f0f0f0; width: 103pt; background-color: transparent;" width="137">See</td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">[\![</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>[\![</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\{</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\{</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\|</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\|</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\}</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\}</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\aleph</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\aleph</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">α</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\alpha</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\alpha</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨿</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\amalg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\amalg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\angle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\angle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ast</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ast</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≍</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">\</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\backslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\backslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">β</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\beta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\beta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcirc</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcirc</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigodot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigodot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigoplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigoplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigotimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigotimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigsqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigsqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangledown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangledown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangleup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangleup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\biguplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\biguplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigwedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigwedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigvee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigvee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bowtie</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bowtie</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">□</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Box</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Box</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bullet</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bullet</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">χ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\chi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\chi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\circ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\circ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\clubsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\clubsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\coprod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\coprod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">†</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dashv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dashv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">‡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamondsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamondsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">÷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\div</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\div</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\doteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\doteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℓ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ell</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ell</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\emptyset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\emptyset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\epsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\epsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">η</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\eta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\eta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\exists</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\exists</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\flat</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\flat</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\forall</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\forall</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\frown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\frown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gets</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gets</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℏ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hbar</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hbar</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\heartsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\heartsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Im</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Im</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ı</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\imath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\imath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\in</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\in</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∞</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\infty</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\infty</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\int</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\int</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ι</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\iota</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\iota</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">j</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\jmath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\jmath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">κ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\kappa</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\kappa</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\land</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\land</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle\!\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle\!\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">[</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\le</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\le</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌊</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ll</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ll</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lnot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lnot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟸</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟵</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longmapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longmapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟹</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟶</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mid</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mid</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\models</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\models</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">μ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nabla</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nabla</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\natural</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\natural</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ne</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ne</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nearrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nearrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ni</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ni</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≰</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not=</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not=</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ν</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nwarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nwarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\odot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\odot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oint</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oint</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ominus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ominus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\otimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\otimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\parallel</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\parallel</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\partial</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\partial</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\perp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\perp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϕ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">±</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pm</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pm</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">′</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prime</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prime</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∝</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\propto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\propto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle\!\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle\!\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">]</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℜ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Re</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Re</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ρ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇌</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightleftharpoons</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightleftharpoons</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\searrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\searrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\setminus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\setminus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sharp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sharp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\smile</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\smile</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\spadesuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\spadesuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\star</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\star</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≻</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sum</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sum</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">√</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\surd</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\surd</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\swarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\swarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">τ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\tau</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\tau</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">×</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\times</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\times</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\to</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\to</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\top</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\top</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleleft</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleleft</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleright</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleright</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊎</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ε</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varepsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varepsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varphi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varphi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϖ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varpi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varpi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϱ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varrho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varrho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ς</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varsigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varsigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vartheta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vartheta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">℘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wr</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wr</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ζ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\zeta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\zeta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">]\!]</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>]\!]</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ο</td><br />
<td style="background-color: transparent; border: #f0f0f0;">o</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>o</math></td><br />
</tr><br />
</table></div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=82739
Installing MSSQL for PHP
2011-04-13T23:02:06Z
<p>Stronk7: /* See Also */</p>
<hr />
<div>{{Moodle 1.7}}{{Moodle 1.9}}{{Moodle 2.0}}<br />
== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle 1.7 (and upwards) using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - this one must be run from the server context menu (master database?) and not from the Moodle database's context<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
:Also, don't forget to set one of the following '''alternatives''', in order to get all the data properly "slashed":<br />
:* magic_quotes_gpc = Off '''or'''<br />
:* magic_quotes_gpc = On '''and''' magic_quotes_sybase = On <br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu].<br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== Using ODBTP on Unix or Windows ==<br />
<br />
You can download ODBTP from http://odbtp.sourceforge.net/. Also you will access to the documentation from the same page.<br />
<br />
The downloaded package includes both the source code and some binaries to be installed in the server and some ready-to-use '''mssql extension alternatives''' for some platforms/PHP versions (so you won't need to compile it if your PHP server/version binary package is present).<br />
<br />
First of all, we have to install the Win32 service that comes with the package. Let's assume that it's going to run in the same Win32 machine where your MSSQL server is running (although it can run in any other Win32 server in your network).<br />
<br />
To do do, following the instructions present in http://odbtp.sourceforge.net/install.html, you must:<br />
<br />
Do the following on the MSSQL server:<br />
# Create a directory on the Windows host where the service program files will reside, i.e., md odbtp.<br />
# Copy the files odbtpctl.exe, odbtpsrv.exe and odbtpsrv.ini files from the winservice directory into the directory created in step 1.<br />
# Edit the file odbtpsrv.ini of the previous step and this line: <pre>MaxRequestSize=20971520</pre><br />
# Open a command prompt (cmd) window on the Windows host.<br />
# Change to the directory to which the service program files were copied, i.e., cd odbtp.<br />
# Run the following commands to install and start the service:<br />
#* odbtpctl install<br />
#* odbtpctl start<br />
# With these steps you should have one new service running in your host called "odbtp". Verify it's present and running in the "Services" control panel.<br />
# Don't forget to enable TCP/IP incoming connections to port 2799 in the host you have installed the service!<br />
<br />
Now it's time to build the '''mssql extension alternative'''. First of all, verify if, in the downloaded package, under the "php" dir, there is one extension suitable for your PHP server/version. If it's present, you can simply copy it to the php/extensions dir in your PHP server and skip next points about compiling it from source. It's important to point that, inside each directory, you'll find '''two different''' libraries/dll files. The one that must be copied to the extensions dir is the one called '''"php_odbtp_mssql.xxx"'''!<br />
<br />
If in the downloaded package isn't present the extension matching your PHP platform/version, you should build if from source files. To do that, just '''"configure, make, make install"'''. That will create some stuff under "/usr/local".<br />
<br />
Now that you've successfully built ODBTP is time to create the '''mssql extension alternative''' that will provide us with the capacity of handling MSSQL DBs from within Moodle. To do so, just configure your PHP server adding this new option to the usual ones:<br />
<br />
--with-odbtp-mssql<br />
<br />
then, after the standard "make and make install" steps, your PHP server will be built with MSSQL support provided by ODBTP.<br />
<br />
Do the following on the moodle webserver:<br />
Finally, independently if we are using the binary extension provided in the download or if you have built it from source files, it's time to configure the extension. <br />
1. To do so, add this lines, if no present, to your php.ini file:<br />
<br />
extension=php_odbtp_mssql.dll<br />
<br />
(only for Win32 PHP servers!)<br />
<br />
2. And, for all the server platforms: <br />
<br />
[odbtp]<br />
odbtp.interface_file = "/path/to/your/odbtp.conf"<br />
odbtp.datetime_format = mdyhmsf<br />
odbtp.detach_default_queries = yes<br />
<br />
(where ''"/path/to/your/odbtp.conf"'' is usually '''"/usr/local/etc/odbtp.conf"''' for Unix systems and '''"C:\odbtp\odbtp.conf"''' for Windows systems)<br />
<br />
Then, edit such "odbtp.conf" file and put there these contents:<br />
<br />
[global]<br />
odbtp host = xxx.xxx.xxx (ip or hostname of the Win32 box running the ODBTP service i.e MSSQL server)<br />
type = mssql<br />
unicode sql = yes<br />
use row cache = yes<br />
right trim text = yes<br />
var data size = 20971520<br />
<br />
With this, your PHP server will be able to connect with the MSSQL DB server using ODBTP. From here, just continue with the installation.<br />
<br />
Finally, if you find the ODBTP executables and '''mssql extension alternative''' in binary formats, it only will be necessary to install them in your server (binary packages...) without the need to recompile anything (just the php.ini and odbtp.conf edition steps above will be necessary). Of course, it will be really welcome to have all those binary alternatives documented here.<br />
<br />
Once ODBTP is working, Moodle config.php should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer.<br />
<br />
== Using ODBC on Windows ==<br />
[[ODBC]] allows communication with an SQL database.<br />
{{Not for production sites}}<br />
<br />
1. Go to the '''Administrative Tools''' control panel, then the '''Data Sources (ODBC)''' panel.<br />
<br />
2. Configure one new System/User DSN (call it, for example "moodle"). Dont forget to enable these options if the driver asks for them:<br />
<br />
:* ANSI NULLS Enabled = true<br />
:* Quoted Identifiers Enabled = true<br />
<br />
3. Your Moodle config.php should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'odbc_mssql'; // Note this is different to all the other configs on this page!<br />
$CFG->dbhost = 'moodle'; // Where this matches the Data source name you chose above<br />
$CFG->dbname = ''; // Keep it blank!!<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
4. Install Moodle as usual. Good luck!<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_MSSQL_for_PHP&diff=82738
Installing MSSQL for PHP
2011-04-13T23:01:56Z
<p>Stronk7: /* See Also */</p>
<hr />
<div>{{Moodle 1.7}}{{Moodle 1.9}}{{Moodle 2.0}}<br />
== Introduction ==<br />
<br />
This short manual is suitable if you are trying to run Moodle 1.7 (and upwards) using the SQL*Server (MSSQL) RDBMS. Steps detailed below must be performed '''before''' installing Moodle itself.<br />
<br />
Some of this may also apply if you wish to access an MSSQL server for external db authentication/enrollment. <br />
<br />
First of all, minimum required version of MSSQL has been stabilised to MSSQL 2005 (v.9), although it '''might work with MSSQL 2000 (v.8) or newer'''. All the development process has been performed using MSSQL 2005 and there could be some '''unknown problems''' with previous releases.<br />
<br />
While PHP comes with one, more or less, standard extension (mssql) that provides access to MSSQL databases, early we found some hard limits on it. Basically such default extension has some limits that prevent us to use it at all (you can find more info about these problems [[Development:XMLDB problems#MSSQL, PHP, UTF-8 and UCS-2|here]]).<br />
<br />
So, in order to allow PHP (i.e. Moodle) to access to MSSQL DBs properly we have to install a '''mssql extension alternative''' to save us from the problems related above. See the sections below for details about the various options.<br />
<br />
== Installation overview ==<br />
<br />
1. Get MSSQL Server installed and running. ([http://www.microsoft.com/sql/editions/express/default.mspx A free limited version, SQL Server Express Edition] is available for testing.)<br />
:Make sure that you choose mixed authentication (Windows and local accounts) to keep things simpler later. You'll be asked to define the "sa" account password (it's the default System Administrator account which has full access to all databases by default).<br />
<br />
2. Make sure MS SQL Server can accept incoming TCP/IP connections on port 1433 (the standard one).<br />
:You might need to explicitly allow this in your Windows firewall (see the Control Panel). You may also need to edit options in the :'''SQL Server Configuration Manager''' -> '''Network Configuration''' -> '''Protocols''' -> '''TCP/IP enabled'''<br />
<br />
3. Open the "SQL Server Management Studio" and create a new empty database. If you are using the "sa" account then you don't need to do anything else here.<br />
<br />
4. Configure these settings in your created (and still empty) database:<br />
<br />
:* ANSI NULLS Enabled = true (ALTER DATABASE xxxx SET ANSI_NULLS ON)<br />
:* Quoted Identifiers Enabled = true (ALTER DATABASE xxxx SET QUOTED_IDENTIFIER ON)<br />
:* Moodle 2.0 only: Row Versioning Enabled (ALTER DATABASE xxxx SET READ_COMMITTED_SNAPSHOT ON) - this one must be run from the server context menu (master database?) and not from the Moodle database's context<br />
<br />
5. Get PHP installed with a web server. Unless you want to do it under IIS or some other way, the packages on the [http://download.moodle.org Moodle download page] are a good solution.<br />
<br />
6. Choose one of the following specific sections for your server to install the '''mssql extension alternative''' installed and running properly on your PHP box.<br />
<br />
7. Set the following settings in your php.ini file<br />
:* mssql.textlimit = 20971520<br />
:* mssql.textsize = 20971520<br />
:Also, don't forget to set one of the following '''alternatives''', in order to get all the data properly "slashed":<br />
:* magic_quotes_gpc = Off '''or'''<br />
:* magic_quotes_gpc = On '''and''' magic_quotes_sybase = On <br />
<br />
8. With all this properly configured, you can continue with a [[Installing Moodle|standard Moodle installation]].<br />
<br />
== Using the SQL Server 2005 Driver for PHP from Microsoft on Windows ==<br />
In July 2008 Microsoft [http://social.msdn.microsoft.com/forums/en-US/sqldriverforphp/thread/a10e5202-9e41-4ff8-a33e-fbcc7b951be2/ released] a new SQL Server 2005 Driver for PHP. This is a PHP extension that allows PHP scripts to read and write data on Microsoft SQL Server databases and it overcomes the problems with the native SQL Server extension that was previously bundled with PHP.<br />
<br />
This Microsoft driver is the standard database layer for running Moodle 2 under Microsoft SQL Server databases. See [[Using the Microsoft SQL Server Driver for PHP]] the installation and configuration details.<br />
<br />
This driver is only supported in Moodle 2.0 and up. You should use [https://docs.moodle.org/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Windows FreeTDS] if you are installing an older version of Moodle.<br />
<br />
See MDL-16497 and MDL-15093 for more background information.<br />
<br />
== Using FreeTDS on Windows ==<br />
<br />
<p class="note">'''Important Note 1:''' Due to some previous bugs it's highly recommendable to use PHP >= 5.2.6 and FreeTDS 0.82 + post-release patches ([http://tracker.moodle.org/browse/MDL-14725 more info]).</p><br />
<br />
If your web server is on Windows, use '''php_dblib.dll'''. Despite the name, it's FreeTDS compiled for Windows. (Go to this page for information on [https://docs.moodle.org/en/FreeTDS Using FreeTDS for Unix].) <br />
<br />
Originally we were using the DLLs available at [http://kromann.info/article.php?Id=11062598797760000 Frank Kromann's site], but they are outdated (using old versions of FreeTDS) and that has caused [http://tracker.moodle.org/browse/MDL-14725 some problems] in the past.<br />
<br />
So, right now, the recommended way to use FreeTDS under Windows is to use PHP 5.2.x following the following instructions:<br />
<br />
1. Download the appropriate copy of php_dblib.dll from the list below, and save it into your /PHP/ext directory.<br />
<br />
{| border="1" align="center" cellpadding="5" style="text-align: center;"<br />
|-<br />
! PHP version !! [http://www.iis-aid.com/articles/my_word/difference_between_php_thread_safe_and_non_thread_safe_binaries Thread Safe] !! FreeTDS version !! Download URL<br />
|-<br />
| rowspan="2" | PHP 5.2.x (vc6) || Yes || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090302 patches || [http://download.moodle.org/download.php/dblib/php52/DBLIB_NOTS.zip Download!]<br />
|-<br />
| rowspan="2" | PHP 5.3.x (vc9) || Yes || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_TS.zip Download!]<br />
|-<br />
| No || 0.82 + 20090904 patches || [http://download.moodle.org/download.php/dblib/php53/DBLIB_NOTS.zip Download!]<br />
|-<br />
| colspan="4" | Thanks to [http://remote-learner.net/ Remote-Learner]] (Moodle [http://moodle.com/partners/ Partner]) and specially to Bryan Williams, donating one Visual C++ 6.0 Pro license to Moodle. Thanks to Trevor Johnson and his builds of the dblib extensions. Thanks to Daniele, Doug, Luis, Sean and many others by their collaboration in MDL-14725. Thanks to Frediano Ziglio and James K. Lowden from [http://freetds.org freetds.org] by their support. Thanks to Alastair Hole by providing the PHP 5.3 builds of the libraries. Thanks!<br />
|}<br />
<br />
(alternatively here you can find some [[Development:Compiling FreeTDS under Windows|instructions to build those freetds extensions under win32]] yourself)<br />
<br />
<br />
2. FreeTDS requires the .NET Framework v1.1 to be installed. You can [http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&DisplayLang=en download it from the Microsoft website] along with its [http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en service pack]. Alternatively, if you do not wish to install this framework, you can [http://kromann.info/ms-libs/msvcr71.dll download the required DLL] from Frank's site, and save it into your /PHP root directory.<br />
<br />
<br />
3. Edit your /PHP/php.ini file and add this line:<br />
<br />
extension=php_dblib.dll <br />
<br />
Make sure that any lines referring to the php_mssql.dll extension are DISABLED (commented out).<br />
<br />
<br />
4. When the PHP engine loads the FreeTDS extension it needs to be passed certain infiormation in order to be able to connect to your Moodle database. To retrieve this information FreeTDS looks for a file called '''freetds.conf''' in the root folder of the server that PHP installed on (e.g. C:\).<br />
<br />
<br />
'''freetds.conf''' should have the following structure:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
If you want to connect to a particular [http://msdn.microsoft.com/en-us/library/aa174516(SQL.80).aspx instance] of MSSQL you should specify the instance name:<br />
<br />
[global]<br />
host = xxx.xxx.xxx.xxx (host name or ip of the MSSQL server)<br />
instance = xxx (instance name, e.g. INST2)<br />
port = 1433<br />
client charset = UTF-8<br />
tds version = 8.0<br />
text size = 20971520<br />
<br />
<br />
'''Notes:'''<br />
*You can configure FreeTDS to look for the freetds.conf file in any directory that you want - you don't have to use C:\. To do this create a SYSTEM environment variable called '''FREETDS''' and point it to the directory where you have installed the freetds.conf file. If you do not set this environment variable FreeTDS will look for the freetds.conf file in the C:\ folder, which is the default. One possible benefit of setting the FREETDS environment variable and using a different installation directory for freetds.conf is that C:\ is very predictable to a hacker that knows anything about FreeTDS and that is the first place that he would look if he wanted to compromise your system. So, using a different installation directory would just make your system stronger. See the FreeTDS [http://www.freetds.org/userguide/envvar.htm Setting the environment variables] documentation for more information about this FREETDS environment variable.<br />
<br />
*Alternatively, you can [[Development:Compiling FreeTDS under Windows|recompile]] the FreeTDS extension yourself and change the default location to your preferred location at compile time. Then it is not necessary to create any environment variable. You must just ensure that freetds.conf is in the same folder that you specify when you compile php_dblib.dll.<br />
<br />
*MSSQL is usually installed with port 1433 as the default. However, if the port was changed on your server when you installed MSSQL then you need to specify the correct port number.<br />
<br />
<br />
5. Your Moodle '''config.php''' should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer. Alternatively you can use the config-dist.php file that comes with the Moodle package to create your own config.php file.<br />
<br />
<br />
6. Restart or start your web server. If Moodle still cannot communicate with the database server, please turn display_startup_errors to "On" in your /PHP/php.ini file, then restart the web server and check for any errors that may indicate incorrect DLL versions or missing dependencies. These error reports, turned off by default in PHP, can be vital in locating a problem with new extension installations.<br />
<br />
<br />
7. Database conection test, try this PHP script, just put in a text file called test.php change ('localhost', 'db_user', 'db_password') to suite your setup, and load from local host (http://localhost/test.php)...<br />
<br />
<code php><br />
<?php<br />
$link = mssql_connect('localhost', 'db_user', 'db_password');<br />
if(!$link) {<br />
echo'Could not connect';<br />
die('Could not connect: ' . mssql_error());<br />
}<br />
echo'Successful connection';<br />
mssql_close($link);<br />
?><br />
</code><br />
<br />
8. Install Moodle as usual. Good luck!<br />
<br />
<br />
=== Troubleshooting ===<br />
If you encounter some problems you can try:<br />
*check that you have DotNet framework 1.1 installed (later version are installed on Vista, but you could need this specific one)<br /><br />
*enable TCP/IP for MSSQL: SQL Server 2005 Network Configuration -> Protocols for MSSQLSERVER -> TCP/IP (Enable) -> Properties -> Ip Addresses -> 127.0.0.1 (Active+Enable)<br /><br />
*if you are using SQL Server 2005 and you have the error ''4004: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier'', try the ODBTP method (next chapter). The SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you could have to switch away from tools based on TDS and DB-Library :(<br />
<br />
== FreeTDS on Linux (on Ubuntu by compiling an mssql.so extension) ==<br />
This is a good read to [http://www.robert-gonzalez.com/2009/02/18/building-the-php-ms-sql-server-extension-from-source-on-ubuntu-810/ building a FreeTDS based mssql extension for apache on Ubuntu].<br />
<br />
Note: the freetds.conf file you use should have "text size = 20971520" as mentioned in the FreeTDS on Windows section otherwise you might see sessions logging out or worse apache segmentation faults. Also see [[FreeTDS]].<br />
<br />
== Using FreeTDS on Debian Lenny ==<br />
I found the following solution using:<br />
* PHP Version 5.2.6-1+lenny9<br />
* Microsoft SQL Server Enterprise Edition, version: 9.00.4053.00<br />
<pre>apt-get install libsybdb5 freetds-common php5-sybase<br />
/etc/init.d/apache2 restart</pre><br />
At the end of the process, if all goes fine, you will find in the mssql section of phpinfo();<br />
<br />
{| class="nicetable"<br />
|-<br />
! MSSQL Support<br />
! enabled<br />
|-<br />
| Library version <br />
| FreeTDS <br />
|}<br />
<br />
Once FreeTDS is correctly installed, don not forget to set it up following explanations in https://docs.moodle.org/en/FreeTDS<br />
<br />
== Using ODBTP on Unix or Windows ==<br />
<br />
You can download ODBTP from http://odbtp.sourceforge.net/. Also you will access to the documentation from the same page.<br />
<br />
The downloaded package includes both the source code and some binaries to be installed in the server and some ready-to-use '''mssql extension alternatives''' for some platforms/PHP versions (so you won't need to compile it if your PHP server/version binary package is present).<br />
<br />
First of all, we have to install the Win32 service that comes with the package. Let's assume that it's going to run in the same Win32 machine where your MSSQL server is running (although it can run in any other Win32 server in your network).<br />
<br />
To do do, following the instructions present in http://odbtp.sourceforge.net/install.html, you must:<br />
<br />
Do the following on the MSSQL server:<br />
# Create a directory on the Windows host where the service program files will reside, i.e., md odbtp.<br />
# Copy the files odbtpctl.exe, odbtpsrv.exe and odbtpsrv.ini files from the winservice directory into the directory created in step 1.<br />
# Edit the file odbtpsrv.ini of the previous step and this line: <pre>MaxRequestSize=20971520</pre><br />
# Open a command prompt (cmd) window on the Windows host.<br />
# Change to the directory to which the service program files were copied, i.e., cd odbtp.<br />
# Run the following commands to install and start the service:<br />
#* odbtpctl install<br />
#* odbtpctl start<br />
# With these steps you should have one new service running in your host called "odbtp". Verify it's present and running in the "Services" control panel.<br />
# Don't forget to enable TCP/IP incoming connections to port 2799 in the host you have installed the service!<br />
<br />
Now it's time to build the '''mssql extension alternative'''. First of all, verify if, in the downloaded package, under the "php" dir, there is one extension suitable for your PHP server/version. If it's present, you can simply copy it to the php/extensions dir in your PHP server and skip next points about compiling it from source. It's important to point that, inside each directory, you'll find '''two different''' libraries/dll files. The one that must be copied to the extensions dir is the one called '''"php_odbtp_mssql.xxx"'''!<br />
<br />
If in the downloaded package isn't present the extension matching your PHP platform/version, you should build if from source files. To do that, just '''"configure, make, make install"'''. That will create some stuff under "/usr/local".<br />
<br />
Now that you've successfully built ODBTP is time to create the '''mssql extension alternative''' that will provide us with the capacity of handling MSSQL DBs from within Moodle. To do so, just configure your PHP server adding this new option to the usual ones:<br />
<br />
--with-odbtp-mssql<br />
<br />
then, after the standard "make and make install" steps, your PHP server will be built with MSSQL support provided by ODBTP.<br />
<br />
Do the following on the moodle webserver:<br />
Finally, independently if we are using the binary extension provided in the download or if you have built it from source files, it's time to configure the extension. <br />
1. To do so, add this lines, if no present, to your php.ini file:<br />
<br />
extension=php_odbtp_mssql.dll<br />
<br />
(only for Win32 PHP servers!)<br />
<br />
2. And, for all the server platforms: <br />
<br />
[odbtp]<br />
odbtp.interface_file = "/path/to/your/odbtp.conf"<br />
odbtp.datetime_format = mdyhmsf<br />
odbtp.detach_default_queries = yes<br />
<br />
(where ''"/path/to/your/odbtp.conf"'' is usually '''"/usr/local/etc/odbtp.conf"''' for Unix systems and '''"C:\odbtp\odbtp.conf"''' for Windows systems)<br />
<br />
Then, edit such "odbtp.conf" file and put there these contents:<br />
<br />
[global]<br />
odbtp host = xxx.xxx.xxx (ip or hostname of the Win32 box running the ODBTP service i.e MSSQL server)<br />
type = mssql<br />
unicode sql = yes<br />
use row cache = yes<br />
right trim text = yes<br />
var data size = 20971520<br />
<br />
With this, your PHP server will be able to connect with the MSSQL DB server using ODBTP. From here, just continue with the installation.<br />
<br />
Finally, if you find the ODBTP executables and '''mssql extension alternative''' in binary formats, it only will be necessary to install them in your server (binary packages...) without the need to recompile anything (just the php.ini and odbtp.conf edition steps above will be necessary). Of course, it will be really welcome to have all those binary alternatives documented here.<br />
<br />
Once ODBTP is working, Moodle config.php should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'mssql_n'; // Required<br />
$CFG->dbhost = 'localhost'; // assuming MS SQL is on the same server, otherwise use an IP<br />
$CFG->dbname = 'moodle'; // or whatever you called the database you created<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
If you don't have a config.php file yet, it can be generated as normal from the Moodle installer.<br />
<br />
== Using ODBC on Windows ==<br />
[[ODBC]] allows communication with an SQL database.<br />
{{Not for production sites}}<br />
<br />
1. Go to the '''Administrative Tools''' control panel, then the '''Data Sources (ODBC)''' panel.<br />
<br />
2. Configure one new System/User DSN (call it, for example "moodle"). Dont forget to enable these options if the driver asks for them:<br />
<br />
:* ANSI NULLS Enabled = true<br />
:* Quoted Identifiers Enabled = true<br />
<br />
3. Your Moodle config.php should include lines like these:<br />
<br />
<code php><br />
$CFG->dbtype = 'odbc_mssql'; // Note this is different to all the other configs on this page!<br />
$CFG->dbhost = 'moodle'; // Where this matches the Data source name you chose above<br />
$CFG->dbname = ''; // Keep it blank!!<br />
$CFG->dbuser = 'yourusername'; // I usually use the 'sa' account (dbowner perms are enough)<br />
$CFG->dbpass = 'yourpassword';<br />
$CFG->dbpersist = false;<br />
$CFG->prefix = 'mdl_'; //Prefix, you can change it, but NEVER leave it blank.<br />
</code><br />
<br />
4. Install Moodle as usual. Good luck!<br />
<br />
== See Also ==<br />
* [[Installing Moodle]]<br />
* [[Errors FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum].<br />
* [[Beginning Administration FAQ]]<br />
* [[Installing Oracle for PHP]]<br />
<br />
[[Category:FAQ]]<br />
[[Category:Installation]]<br />
[[Category:Developer]]<br />
[[Category:XMLDB]]<br />
[[Category:DB]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:MediaWiki_TeX_test&diff=82737
Development:MediaWiki TeX test
2011-04-13T22:58:00Z
<p>Stronk7: </p>
<hr />
<div>This should look like some maths:<br />
<br />
<math>\int_{-\infty}^\infty e^{-x^{tim}}\,dx = \sqrt{hunt^4}</math><br />
<br />
(This page was created for the benefit of MDLSITE-649.)<br />
<br />
Heavy test:<br />
<br />
== Functions, symbols, special characters ==<br />
<br />
<!-- Eight symbols per line seems to be optimal--><br />
{| class="wikitable"<br />
! colspan="2" |<h3>Accents/Diacritics</h3><br />
|-<br />
|<code>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}</code><br />
|<math>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}\,\!</math><br />
|-<br />
|<code>\check{a} \bar{a} \ddot{a} \dot{a}</code><br />
|<math>\check{a} \bar{a} \ddot{a} \dot{a}\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Standard functions</h3><br />
|-<br />
|<code>\sin a \cos b \tan c</code><br />
|<math>\sin a \cos b \tan c\!</math><br />
|-<br />
|<code>\sec d \csc e \cot f</code><br />
|<math>\sec d \csc e \cot f\,\!</math><br />
|-<br />
|<code>\arcsin h \arccos i \arctan j</code><br />
|<math>\arcsin h \arccos i \arctan j\,\!</math><br />
|-<br />
|<code>\sinh k \cosh l \tanh m \coth n\!</code><br />
|<math>\sinh k \cosh l \tanh m \coth n\!</math><br />
|-<br />
|<code>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</code><br />
|<math>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</math><br />
|-<br />
|<code>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t</code><br />
|<math>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t\,\!</math><br />
|-<br />
|<code>\lim u \limsup v \liminf w \min x \max y\!</code><br />
|<math>\lim u \limsup v \liminf w \min x \max y\!</math><br />
|-<br />
|<code>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</code><br />
|<math>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</math><br />
|-<br />
|<code>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n</code><br />
|<math>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Modular arithmetic</h3><br />
|-<br />
|<code>s_k \equiv 0 \pmod{m}</code><br />
|<math>s_k \equiv 0 \pmod{m}\,\!</math><br />
|-<br />
|<code>a\,\bmod\,b</code><br />
|<math>a\,\bmod\,b\,\!</math><br />
|-<br />
! colspan="2" | <h3>Derivatives</h3><br />
|-<br />
|<code>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</code><br />
|<math>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Sets</h3><br />
|-<br />
|<code>\forall \exists \empty \emptyset \varnothing</code><br />
|<math>\forall \exists \empty \emptyset \varnothing\,\!</math><br />
|-<br />
|<code>\in \ni \not \in \notin \subset \subseteq \supset \supseteq</code><br />
|<math>\in \ni \not \in \notin \subset \subseteq \supset \supseteq\,\!</math><br />
|-<br />
|<code>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus</code><br />
|<math>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus\,\!</math><br />
|-<br />
|<code>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup</code><br />
|<math>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Operators</h3><br />
|-<br />
|<code>+ \oplus \bigoplus \pm \mp - </code><br />
|<math>+ \oplus \bigoplus \pm \mp - \,\!</math><br />
|-<br />
|<code>\times \otimes \bigotimes \cdot \circ \bullet \bigodot</code><br />
|<math>\times \otimes \bigotimes \cdot \circ \bullet \bigodot\,\!</math><br />
|-<br />
|<code>\star * / \div \frac{1}{2}</code><br />
|<math>\star * / \div \frac{1}{2}\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Logic</h3><br />
|-<br />
|<code>\land (or \and) \wedge \bigwedge \bar{q} \to p</code><br />
|<math>\land \wedge \bigwedge \bar{q} \to p\,\!</math><br />
|-<br />
|<code>\lor \vee \bigvee \lnot \neg q \And</code><br />
|<math>\lor \vee \bigvee \lnot \neg q \And\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Root</h3><br />
|-<br />
|<code>\sqrt{2} \sqrt[n]{x}</code><br />
|<math>\sqrt{2} \sqrt[n]{x}\,\!</math><br />
|-<br />
! colspan="2" | <h3>Relations</h3><br />
|-<br />
|<code>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}</code><br />
|<math>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}\,\!</math><br />
|-<br />
|<code>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto</code><br />
|<math>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Geometric</h3><br />
|-<br />
|<code><nowiki>\Diamond \Box \triangle \angle \perp \mid \nmid \| 45^\circ</nowiki></code><br />
|<math>\Diamond \, \Box \, \triangle \, \angle \perp \, \mid \; \nmid \, \| 45^\circ\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Arrows</h3><br />
|-<br />
|<code>\leftarrow (or \gets) \rightarrow (or \to) \nleftarrow \nrightarrow \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow</code><br />
|<math>\leftarrow \rightarrow \nleftarrow \not\to \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow \,\!</math><br />
|-<br />
|<code>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow (or \iff)</code><br />
|<math>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow \!</math><br />
|-<br />
|<code>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow</code><br />
|<math>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow \!</math><br />
|-<br />
|<code>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons</code><br />
|<math>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons \,\!</math><br />
|-<br />
|<code>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright</code><br />
|<math>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright \,\!</math><br />
|-<br />
|<code>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft</code><br />
|<math>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft \,\!</math><br />
|-<br />
|<code>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow </code><br />
|<math>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow \,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Special</h3><br />
|-<br />
|<code>\And \eth \S \P \% \dagger \ddagger \ldots \cdots</code><br />
|<math>\And \eth \S \P \% \dagger \ddagger \ldots \cdots\,\!</math><br />
|-<br />
|<code>\smile \frown \wr \triangleleft \triangleright \infty \bot \top</code><br />
|<math>\smile \frown \wr \triangleleft \triangleright \infty \bot \top\,\!</math><br />
|-<br />
|<code>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar</code><br />
|<math>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar\,\!</math><br />
|-<br />
|<code>\ell \mho \Finv \Re \Im \wp \complement</code><br />
|<math>\ell \mho \Finv \Re \Im \wp \complement\,\!</math><br />
|-<br />
|<code>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp</code><br />
|<math>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Unsorted (new stuff)</h3><br />
|-<br />
|<code> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</code><br />
|<math> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</math><br />
|-<br />
|<code> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge</code><br />
|<math> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge\!</math><br />
|-<br />
|<code> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</code><br />
|<math> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</math><br />
|-<br />
|<code> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</code><br />
|<math> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</math><br />
|-<br />
|<code> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</code><br />
|<math> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</math><br />
|-<br />
|<code> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</code><br />
|<math> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</math><br />
|-<br />
|<code> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</code><br />
|<math> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</math><br />
|-<br />
|<code> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</code><br />
|<math> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</math><br />
|-<br />
|<code> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</code><br />
|<math> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</math><br />
|-<br />
|<code> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</code><br />
|<math> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</math><br />
|-<br />
|<code> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</code><br />
|<math> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</math><br />
|-<br />
|<code> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</code><br />
|<math> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</math><br />
|-<br />
|<code>\subsetneq</code><br />
|<math>\subsetneq</math><br />
|-<br />
|<code> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</code><br />
|<math> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</math><br />
|-<br />
|<code> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</code><br />
|<math> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</math><br />
|-<br />
|<code> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</code><br />
|<math> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</math><br />
|-<br />
|<code>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus</code><br />
|<math>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus\,\!</math><br />
|-<br />
|<code>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq</code><br />
|<math>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq\,\!</math><br />
|-<br />
|<code>\dashv \asymp \doteq \parallel</code><br />
|<math>\dashv \asymp \doteq \parallel\,\!</math><br />
|-<br />
|<code>\ulcorner \urcorner \llcorner \lrcorner</code><br />
|<math>\ulcorner \urcorner \llcorner \lrcorner</math><br />
|}<br />
<br />
== Larger Expressions ==<br />
=== Subscripts, superscripts, integrals ===<br />
{| border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"<br />
!rowspan="2"|Feature!!rowspan="2"|Syntax!!colspan="2"|How it looks rendered<br />
|-<br />
!HTML!!PNG<br />
|-<br />
|-<br />
|Superscript||<code>a^2</code>||<math>a^2</math>||<math>a^2 \,\!</math><br />
|-<br />
|Subscript||<code>a_2</code>||<math>a_2</math>||<math>a_2 \,\!</math><br />
|-<br />
|rowspan=2|Grouping||<code>a^{2+2}</code>||<math>a^{2+2}</math>||<math>a^{2+2}\,\!</math><br />
|-<br />
|<code>a_{i,j}</code>||<math>a_{i,j}</math>||<math>a_{i,j}\,\!</math><br />
|-<br />
|rowspan=2|Combining sub & super without and with horizontal separation||<code>x_2^3</code>||<math>x_2^3</math>||<math>x_2^3 \,\!</math><br />
|-<br />
|<code>{x_2}^3</code>||<math>{x_2}^3</math>||<math>{x_2}^3 \,\!</math><br />
|-<br />
|Super super||<code>10^{10^{ \,\!{8} }</code>||colspan=2|<math>10^{10^{ \,\! 8 } }</math><br />
|-<br />
|Super super||<code>10^{10^{ \overset{8}{} }}</code>||colspan=2|<math>10^{10^{ \overset{8}{} }}</math><br />
|-<br />
|Super super (wrong in HTML in some browsers)||<code>10^{10^8}</code> ||colspan=2|<math>10^{10^8}</math><br />
|-<br />
|rowspan="2"|Preceding and/or Additional sub & super||<code>\sideset{_1^2}{_3^4}\prod_a^b</code>||colspan=2|<math>\sideset{_1^2}{_3^4}\prod_a^b</math><br />
|-<br />
|<code>{}_1^2\!\Omega_3^4</code>||colspan=2|<math>{}_1^2\!\Omega_3^4</math><br />
|-<br />
|rowspan="4"|Stacking<br />
|<code>\overset{\alpha}{\omega}</code>||colspan="2"|<math>\overset{\alpha}{\omega}</math><br />
|-<br />
|<code>\underset{\alpha}{\omega}</code>||colspan="2"|<math>\underset{\alpha}{\omega}</math><br />
|-<br />
|<code>\overset{\alpha}{\underset{\gamma}{\omega}}</code>||colspan="2"|<math>\overset{\alpha}{\underset{\gamma}{\omega}}</math><br />
|-<br />
|<code>\stackrel{\alpha}{\omega}</code>||colspan="2"|<math>\stackrel{\alpha}{\omega}</math><br />
|-<br />
|Derivative (forced PNG)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki>\!</code>||&nbsp;||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (f in italics may overlap primes in HTML)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki></code>||<math>x', y'', f', f''</math>||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (wrong in HTML)||<code>x^\prime, y^{\prime\prime}</code>||<math>x^\prime, y^{\prime\prime}</math>||<math>x^\prime, y^{\prime\prime}\,\!</math><br />
|-<br />
|Derivative (wrong in PNG)||<code>x\prime, y\prime\prime</code>||<math>x\prime, y\prime\prime</math>||<math>x\prime, y\prime\prime\,\!</math><br />
|-<br />
|Derivative dots||<code>\dot{x}, \ddot{x}</code>||colspan=2|<math>\dot{x}, \ddot{x}</math><br />
|-<br />
|rowspan="3"|Underlines, overlines, vectors||<code>\hat a \ \bar b \ \vec c</code>||colspan=2|<math>\hat a \ \bar b \ \vec c</math><br />
|-<br />
|<code>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</code>||colspan=2|<math>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</math><br />
|-<br />
|<code>\overline{g h i} \ \underline{j k l}</code>||colspan=2|<math>\overline{g h i} \ \underline{j k l}</math><br />
|-<br />
|Arrows||<code> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</code>||colspan=2|<math> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</math><br />
|-<br />
|Overbraces||<code>\overbrace{ 1+2+\cdots+100 }^{5050}</code>||colspan=2|<math>\overbrace{ 1+2+\cdots+100 }^{5050}</math><br />
|-<br />
|Underbraces||<code>\underbrace{ a+b+\cdots+z }_{26}</code>||colspan=2|<math>\underbrace{ a+b+\cdots+z }_{26}</math><br />
|-<br />
|Sum||<code>\sum_{k=1}^N k^2</code>||colspan=2|<math>\sum_{k=1}^N k^2</math><br />
|-<br />
|Sum (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \sum_{k=1}^N k^2 </code>||colspan=2|<math>\textstyle \sum_{k=1}^N k^2</math><br />
|-<br />
|Product||<code>\prod_{i=1}^N x_i</code>||colspan=2|<math>\prod_{i=1}^N x_i</math><br />
|-<br />
|Product (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \prod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \prod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct||<code>\coprod_{i=1}^N x_i</code>||colspan=2|<math>\coprod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \coprod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \coprod_{i=1}^N x_i</math><br />
|-<br />
|Limit||<code>\lim_{n \to \infty}x_n</code>||colspan=2|<math>\lim_{n \to \infty}x_n</math><br />
|-<br />
|Limit (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \lim_{n \to \infty}x_n</code>||colspan=2|<math>\textstyle \lim_{n \to \infty}x_n</math><br />
|-<br />
|Integral||<code>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (alternate limits style)||<code>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \int\limits_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int\limits_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>, alternate limits style)||<code>\textstyle \int_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Double integral||<code>\iint\limits_D \, dx\,dy</code>||colspan=2|<math>\iint\limits_D \, dx\,dy</math><br />
|-<br />
|Triple integral||<code>\iiint\limits_E \, dx\,dy\,dz</code>||colspan=2|<math>\iiint\limits_E \, dx\,dy\,dz</math><br />
|-<br />
|Quadruple integral||<code>\iiiint\limits_F \, dx\,dy\,dz\,dt</code>||colspan=2|<math>\iiiint\limits_F \, dx\,dy\,dz\,dt</math><br />
|-<br />
|Line or path integral||<code>\int_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\int_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Closed line or path integral||<code>\oint_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\oint_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Intersections||<code>\bigcap_1^n p</code>||colspan=2|<math>\bigcap_1^n p</math><br />
|-<br />
|Unions||<code>\bigcup_1^k p</code>||colspan=2|<math>\bigcup_1^k p</math><br />
|}<br />
<br />
=== Fractions, matrices, multilines ===<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>Fractions</td><br />
<td><code>\frac{2}{4}=0.5</code></td><br />
<td><math>\frac{2}{4}=0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Small Fractions</td><br />
<td><code>\tfrac{2}{4} = 0.5</code></td><br />
<td><math>\tfrac{2}{4} = 0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (normal) Fractions</td><br />
<td><code>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a </code></td><br />
<td><math>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (nested) Fractions</td><br />
<td><code>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</code></td><br />
<td><math>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Binomial coefficients</td><br />
<td><code>\binom{n}{k}</code></td><br />
<td><math>\binom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Small Binomial coefficients</td><br />
<td><code>\tbinom{n}{k}</code></td><br />
<td><math>\tbinom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Large (normal) Binomial coefficients</td><br />
<td><code>\dbinom{n}{k}</code></td><br />
<td><math>\dbinom{n}{k}</math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="7">Matrices</td><br />
<td><pre>\begin{matrix}<br />
x & y \\<br />
z & v <br />
\end{matrix}</pre></td><br />
<td><math>\begin{matrix} x & y \\ z & v<br />
\end{matrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{vmatrix}<br />
x & y \\<br />
z & v <br />
\end{vmatrix}</pre></td><br />
<td><math>\begin{vmatrix} x & y \\ z & v<br />
\end{vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Vmatrix}<br />
x & y \\<br />
z & v<br />
\end{Vmatrix}</pre></td><br />
<td><math>\begin{Vmatrix} x & y \\ z & v<br />
\end{Vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{bmatrix}<br />
0 & \cdots & 0 \\<br />
\vdots & \ddots & \vdots \\ <br />
0 & \cdots & 0<br />
\end{bmatrix}</pre></td><br />
<td><math>\begin{bmatrix} 0 & \cdots & 0 \\ \vdots<br />
& \ddots & \vdots \\ 0 & \cdots &<br />
0\end{bmatrix} </math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Bmatrix}<br />
x & y \\<br />
z & v<br />
\end{Bmatrix}</pre></td><br />
<td><math>\begin{Bmatrix} x & y \\ z & v<br />
\end{Bmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{pmatrix}<br />
x & y \\<br />
z & v <br />
\end{pmatrix}</pre></td><br />
<td><math>\begin{pmatrix} x & y \\ z & v<br />
\end{pmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</pre></td><br />
<td><math><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</math></td><br />
</tr><br />
<br />
<br />
<br />
<tr><br />
<td>Case distinctions</td><br />
<td><pre><br />
f(n) = <br />
\begin{cases} <br />
n/2, & \mbox{if }n\mbox{ is even} \\<br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases}</pre></td><br />
<td><math>f(n) = <br />
\begin{cases}<br />
n/2, & \mbox{if }n\mbox{ is even} \\ <br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases} </math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="2">Multiline equations</td><br />
<td><pre><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</pre></td><br />
<td><math><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</pre></td><br />
<td><math><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</math></td><br />
</tr><br />
<tr><br />
<td>Multiline equations <small>(must define number of colums used ({lcr}) <small>(should not be used unless needed)</small></small></td><br />
<td><pre><br />
\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Multiline equations (more)</td><br />
<td><pre><br />
\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Breaking up a long expression so that it wraps when necessary, at the expense of destroying correct spacing</td><br />
<td><pre><br />
<nowiki><br />
<math>f(x) \,\!</math><br />
<math>= \sum_{n=0}^\infty a_n x^n </math><br />
<math>= a_0+a_1x+a_2x^2+\cdots</math><br />
</nowiki><br />
</pre><br />
</td><br />
<td><br />
<math>f(x) \,\!</math><math>= \sum_{n=0}^\infty a_n x^n </math><math>= a_0 +a_1x+a_2x^2+\cdots</math><br />
</td><br />
</tr><br />
<br />
<tr><br />
<td>Simultaneous equations</td><br />
<td><pre>\begin{cases}<br />
3x + 5y + z \\<br />
7x - 2y + 4z \\<br />
-6x + 3y + 2z <br />
\end{cases}</pre></td><br />
<td><math>\begin{cases} 3x + 5y + z \\ 7x - 2y + 4z \\ -6x + 3y + 2z \end{cases}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Arrays</td><br />
<td><pre><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</pre></td><br />
<td><math><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</math></td><br />
</tr><br />
</table><br />
<br />
=== Parenthesizing big expressions, brackets, bars ===<br />
{| class="wikitable"<br />
! Feature !! Syntax !! How it looks rendered<br />
|-<br />
| Bad<br />
| <code>( \frac{1}{2} )</code><br />
| <math>( \frac{1}{2} )</math><br />
|-<br />
| Good<br />
| <code>\left ( \frac{1}{2} \right )</code><br />
| <math>\left ( \frac{1}{2} \right )</math><br />
|}<br />
<br />
You can use various delimiters with \left and \right: <br />
<br />
{| class="wikitable"<br />
! Feature<br />
! Syntax<br />
! How it looks rendered<br />
|-<br />
| Parentheses<br />
| <code>\left ( \frac{a}{b} \right )</code><br />
| <math>\left ( \frac{a}{b} \right )</math><br />
|-<br />
| Brackets<br />
| <code>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</code><br />
| <math>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</math><br />
|-<br />
| Braces<br />
| <code>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</code><br />
| <math>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</math><br />
|-<br />
| Angle brackets<br />
| <code>\left \langle \frac{a}{b} \right \rangle</code><br />
| <math>\left \langle \frac{a}{b} \right \rangle</math><br />
|-<br />
| Bars and double bars<br />
| <code><nowiki>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</nowiki></code><br />
| <math>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</math><br />
|-<br />
| Floor and ceiling functions:<br />
| <code>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</code><br />
| <math>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</math><br />
|-<br />
| Slashes and backslashes<br />
| <code>\left / \frac{a}{b} \right \backslash</code><br />
| <math>\left / \frac{a}{b} \right \backslash</math><br />
|-<br />
| Up, down and up-down arrows<br />
| <code>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</code><br />
| <math>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</math><br />
|-<br />
| Delimiters can be mixed,<br/>as long as \left and \right match<br />
| <code><nowiki>\left [ 0,1 \right )</code> <br/> <code>\left \langle \psi \right |</nowiki></code><br />
| <math>\left [ 0,1 \right )</math> <br/> <math>\left \langle \psi \right |</math><br />
|-<br />
| Use \left. and \right. if you don't<br/>want a delimiter to appear:<br />
| <code>\left . \frac{A}{B} \right \} \to X</code><br />
| <math>\left . \frac{A}{B} \right \} \to X</math><br />
|-<br />
| rowspan="7" | Size of the delimiters<br />
| <code>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]/<code><br />
| <math>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]</math><br />
|-<br />
| <code>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</code><br />
| <math>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</math><br />
|-<br />
| <code><nowiki>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</nowiki></code><br />
| <math>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</math><br />
|-<br />
| <code>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</code><br />
| <math>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</math><br />
|-<br />
| <code>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</code><br />
| <math>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</math><br />
|-<br />
| <code>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</code><br />
| <math>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</math><br />
|-<br />
| <code>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</code><br />
| <math>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</math><br />
|}<br />
<br />
== Alphabets and typefaces == <br />
[[w:Texvc|Texvc]] cannot render arbitrary [[w:Unicode|Unicode]] characters. Those it can handle can be entered by the expressions below.<br />
For others, such as [[w:Cyrillic|Cyrillic]], they can be entered as Unicode or HTML entities in running text, but cannot be used in displayed formulas.<br />
<br />
{| class="wikitable"<br />
! colspan="2" | Greek alphabet<br />
|-<br />
|<code><nowiki>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta</nowiki></code><br />
|<math>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \,\!</math><br />
|-<br />
|<code><nowiki>\Eta \Theta \Iota \Kappa \Lambda \Mu</nowiki></code><br />
|<math>\Eta \Theta \Iota \Kappa \Lambda \Mu \,\!</math><br />
|-<br />
|<code><nowiki>\Nu \Xi \Pi \Rho \Sigma \Tau</nowiki></code><br />
|<math>\Nu \Xi \Pi \Rho \Sigma \Tau\,\!</math><br />
|-<br />
|<code><nowiki>\Upsilon \Phi \Chi \Psi \Omega</nowiki></code><br />
|<math>\Upsilon \Phi \Chi \Psi \Omega \,\!</math><br />
|-<br />
|<code><nowiki>\alpha \beta \gamma \delta \epsilon \zeta</nowiki></code><br />
|<math>\alpha \beta \gamma \delta \epsilon \zeta \,\!</math><br />
|-<br />
|<code><nowiki>\eta \theta \iota \kappa \lambda \mu</nowiki></code><br />
|<math>\eta \theta \iota \kappa \lambda \mu \,\!</math><br />
|-<br />
|<code><nowiki>\nu \xi \pi \rho \sigma \tau</nowiki></code><br />
|<math>\nu \xi \pi \rho \sigma \tau \,\!</math><br />
|-<br />
|<code><nowiki>\upsilon \phi \chi \psi \omega</nowiki></code><br />
|<math>\upsilon \phi \chi \psi \omega \,\!</math><br />
|-<br />
|<code><nowiki>\varepsilon \digamma \vartheta \varkappa</nowiki></code><br />
|<math>\varepsilon \digamma \vartheta \varkappa \,\!</math><br />
|-<br />
|<code><nowiki>\varpi \varrho \varsigma \varphi</nowiki></code><br />
|<math>\varpi \varrho \varsigma \varphi\,\!</math><br />
|-<br />
! colspan="2" | Blackboard Bold/Scripts<br />
|-<br />
|<code><nowiki>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G}</nowiki></code><br />
|<math>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M}</nowiki></code><br />
|<math>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T}</nowiki></code><br />
|<math>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}</nowiki></code><br />
|<math>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}\,\!</math><br />
|-<br />
! colspan="2" | boldface (vectors)<br />
|-<br />
|<code><nowiki>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G}</nowiki></code><br />
|<math>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M}</nowiki></code><br />
|<math>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T}</nowiki></code><br />
|<math>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z}</nowiki></code><br />
|<math>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g}</nowiki></code><br />
|<math>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m}</nowiki></code><br />
|<math>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t}</nowiki></code><br />
|<math>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z}</nowiki></code><br />
|<math>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4}</nowiki></code><br />
|<math>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}</nowiki></code><br />
|<math>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}\,\!</math><br />
|-<br />
! colspan="2" | Boldface (greek)<br />
|-<br />
|<code><nowiki>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta}</nowiki></code><br />
|<math>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}</nowiki></code><br />
|<math>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}</nowiki></code><br />
|<math>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}</nowiki></code><br />
|<math>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}</nowiki></code><br />
|<math>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}</nowiki></code><br />
|<math>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}</nowiki></code><br />
|<math>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}</nowiki></code><br />
|<math>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa}</nowiki></code><br />
|<math>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}</nowiki></code><br />
|<math>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}\,\!</math><br />
|-<br />
! colspan="2" | Italics<br />
|-<br />
|<code><nowiki>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G}</nowiki></code><br />
|<math>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M}</nowiki></code><br />
|<math>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T}</nowiki></code><br />
|<math>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z}</nowiki></code><br />
|<math>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g}</nowiki></code><br />
|<math>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m}</nowiki></code><br />
|<math>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t}</nowiki></code><br />
|<math>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z}</nowiki></code><br />
|<math>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4}</nowiki></code><br />
|<math>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}</nowiki></code><br />
|<math>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}\,\!</math><br />
|-<br />
! colspan="2" | Roman typeface<br />
|-<br />
|<code><nowiki>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G}</nowiki></code><br />
|<math>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M}</nowiki></code><br />
|<math>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T}</nowiki></code><br />
|<math>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z}</nowiki></code><br />
|<math>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}</nowiki></code><br />
|<math>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}\,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m}</nowiki></code><br />
|<math>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t}</nowiki></code><br />
|<math>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z}</nowiki></code><br />
|<math>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4}</nowiki></code><br />
|<math>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}</nowiki></code><br />
|<math>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}\,\!</math><br />
|-<br />
! colspan="2" | Fraktur typeface<br />
|-<br />
|<code><nowiki>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G}</nowiki></code><br />
|<math>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M}</nowiki></code><br />
|<math>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T}</nowiki></code><br />
|<math>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z}</nowiki></code><br />
|<math>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g}</nowiki></code><br />
|<math>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m}</nowiki></code><br />
|<math>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t}</nowiki></code><br />
|<math>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z}</nowiki></code><br />
|<math>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4}</nowiki></code><br />
|<math>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}</nowiki></code><br />
|<math>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}\,\!</math><br />
|-<br />
! colspan="2" | Calligraphy/Script<br />
|-<br />
|<code><nowiki>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G}</nowiki></code><br />
|<math>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M}</nowiki></code><br />
|<math>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T}</nowiki></code><br />
|<math>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}</nowiki></code><br />
|<math>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}\,\!</math><br />
|-<br />
! colspan="2" | Hebrew<br />
|-<br />
|<code><nowiki>\aleph \beth \gimel \daleth</nowiki></code><br />
|<math>\aleph \beth \gimel \daleth\,\!</math><br />
|}<br />
<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th colspan="2">How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>non-italicised characters</td><br />
<td>\mbox{abc}</td><br />
<td><math>\mbox{abc}</math></td><br />
<td><math>\mbox{abc} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (bad)</td><br />
<td>\mbox{if} n \mbox{is even}</td><br />
<td><math>\mbox{if} n \mbox{is even}</math></td><br />
<td><math>\mbox{if} n \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (good)</td><br />
<td>\mbox{if }n\mbox{ is even}</td><br />
<td><math>\mbox{if }n\mbox{ is even}</math></td><br />
<td><math>\mbox{if }n\mbox{ is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (more legible: ~ is a non-breaking space, while "\ " forces a space)</td><br />
<td>\mbox{if}~n\ \mbox{is even}</td><br />
<td><math>\mbox{if}~n\ \mbox{is even}</math></td><br />
<td><math>\mbox{if}~n\ \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
</table><br />
<br />
== Color ==<br />
<br />
Equations can use color:<br />
<br />
*<code>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</code><br />
*:<math>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</math><br />
<br />
*<code>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</code><br />
*:<math>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</math><br />
<br />
See here for [http://oregonstate.edu/%7Epeterseb/tex/samples/docs/color-package-demo.pdf all named colors] supported by LaTeX.<br />
<br />
Note that color should not be used as the ''only'' way to identify something, because it will become meaningless on black-and-white media or for color-blind people. See [[en:Wikipedia:Manual of Style#Color coding]].<br />
<br />
== Formatting issues ==<br />
=== Spacing ===<br />
Note that TeX handles most spacing automatically, but you may sometimes want manual control. <br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>double quad space</td><br />
<td>a \qquad b</td><br />
<td><math>a \qquad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>quad space</td><br />
<td>a \quad b</td><br />
<td><math>a \quad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space</td><br />
<td>a\ b</td><br />
<td><math>a\ b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space without PNG conversion</td><br />
<td>a \mbox{ } b</td><br />
<td><math>a \mbox{ } b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>large space</td><br />
<td>a\;b</td><br />
<td><math>a\;b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>medium space</td><br />
<td>a\&gt;b</td><br />
<td>[not supported]</td><br />
</tr><br />
<br />
<tr><br />
<td>small space</td><br />
<td>a\,b</td><br />
<td><math>a\,b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>no space</td><br />
<td>ab</td><br />
<td><math>ab\,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>small negative space</td><br />
<td>a\!b</td><br />
<td><math>a\!b</math></td><br />
</tr><br />
<br />
</table><br />
<br />
=== Alignment with normal text flow ===<br />
Due to the default css<br />
<br />
<pre>img.tex { vertical-align: middle; }</pre><br />
<br />
an inline expression like <math>\int_{-N}^{N} e^x\, dx</math> should look good.<br />
<br />
If you need to align it otherwise, use <code><nowiki><math style="vertical-align:-100%;">...</math></nowiki></code> and play with the <code>vertical-align</code> argument until you get it right; however, how it looks may depend on the browser and the browser settings.<br />
<br />
Also note that if you rely on this workaround, if/when the rendering on the server gets fixed in future releases, as a result of this extra manual offset your formulae will suddenly be aligned incorrectly. So use it sparingly, if at all.<br />
<br />
=== Forced PNG rendering ===<br />
<br />
To force the formula to render as PNG, add <code>\,</code> (small space) at the end of the formula (where it is not rendered). This will force PNG if the user is in "HTML if simple" mode, but not for "HTML if possible" mode.<br />
<br />
You can also use <code>\,\!</code> (small space and negative space, which cancel out) anywhere inside the math tags. This ''does'' force PNG even in "HTML if possible" mode, unlike <code>\,</code>.<br />
<br />
This could be useful to keep the rendering of formulae in a proof consistent, for example, or to fix formulae that render incorrectly in HTML (at one time, a^{2+2} rendered with an extra underscore), or to demonstrate how something is rendered when it would normally show up as HTML (as in the examples above).<br />
<br />
For instance:<br />
<br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2}</td><br />
<td><math>a^{c+2}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2} \,</td><br />
<td><math>a^{c+2} \,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{\,\!c+2}</td><br />
<td><math>a^{\,\!c+2}</math> </td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}</td><br />
<td><math>a^{b^{c+2}}</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}} \,</td><br />
<td><math>a^{b^{c+2}} \,</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}\approx 5</td><br />
<td><math>a^{b^{c+2}}\approx 5</math> (due to "<math>\approx</math>" correctly displayed, no code "\,\!" needed)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{\,\!c+2}}</td><br />
<td><math>a^{b^{\,\!c+2}}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>\int_{-N}^{N} e^x\, dx</td><br />
<td><math>\int_{-N}^{N} e^x\, dx</math></td><br />
</tr><br />
<br />
</table><br />
<br />
<br />
This has been tested with most of the formulae on this page, and seems to work perfectly.<br />
<br />
You might want to include a comment in the HTML so people don't "correct" the formula by removing it:<br />
<br />
:''<nowiki><!-- The \,\! is to keep the formula rendered as PNG instead of HTML. Please don't remove it.--></nowiki>''<br />
<br />
<br />
== Examples ==<br />
<br />
<center><br />
===Quadratic Polynomial===<br />
<math>ax^2 + bx + c = 0</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0</math></nowiki><br />
<br />
===Quadratic Polynomial (Force PNG Rendering)===<br />
<math>ax^2 + bx + c = 0\,\!</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0\,\!</math></nowiki><br />
<br />
===Quadratic Formula===<br />
<math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math><br />
<br />
<nowiki><math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math></nowiki><br />
<br />
===Tall Parentheses and Fractions ===<br />
<math>2 = \left( \frac{\left(3-x\right) \times 2}{3-x} \right)</math><br />
<br />
<nowiki><math>2 = \left(<br />
\frac{\left(3-x\right) \times 2}{3-x}<br />
\right)</math></nowiki><br />
<br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
<nowiki><br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
</nowiki><br />
<br />
===Integrals===<br />
<math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds = \int_a^x f(y)(x-y)\,dy</math><br />
<br />
<nowiki><math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds<br />
= \int_a^x f(y)(x-y)\,dy</math></nowiki><br />
<br />
===Summation===<br />
<math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}{3^m\left(m\,3^n+n\,3^m\right)}</math><br />
<br />
<nowiki><math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}<br />
{3^m\left(m\,3^n+n\,3^m\right)}</math></nowiki><br />
<br />
=== Differential Equation ===<br />
<math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math><br />
<br />
<nowiki><math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math></nowiki><br />
<br />
===Complex numbers===<br />
<math>|\bar{z}| = |z|, |(\bar{z})^n| = |z|^n, \arg(z^n) = n \arg(z)</math><br />
<br />
<nowiki><math>|\bar{z}| = |z|,<br />
|(\bar{z})^n| = |z|^n,<br />
\arg(z^n) = n \arg(z)</math></nowiki><br />
<br />
===Limits===<br />
<math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math><br />
<br />
<nowiki><math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math></nowiki><br />
<br />
===Integral Equation===<br />
<math>\phi_n(\kappa)<br />
= \frac{1}{4\pi^2\kappa^2} \int_0^\infty \frac{\sin(\kappa R)}{\kappa R} \frac{\partial}{\partial R} \left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math><br />
<br />
<nowiki><math>\phi_n(\kappa) =<br />
\frac{1}{4\pi^2\kappa^2} \int_0^\infty<br />
\frac{\sin(\kappa R)}{\kappa R}<br />
\frac{\partial}{\partial R}<br />
\left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math></nowiki><br />
<br />
===Example===<br />
<math>\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3},\quad \frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math><br />
<br />
<nowiki><math>\phi_n(\kappa) = <br />
0.033C_n^2\kappa^{-11/3},\quad<br />
\frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math></nowiki><br />
<br />
===Continuation and cases===<br />
<math>f(x) = \begin{cases}1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\ 1 - x^2 & \mbox{otherwise}\end{cases}</math><br />
<br />
<nowiki><math><br />
f(x) =<br />
\begin{cases}<br />
1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\<br />
1 - x^2 & \mbox{otherwise}<br />
\end{cases}<br />
</math></nowiki><br />
<br />
===Prefixed subscript===<br />
<math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z) = \sum_{n=0}^\infty \frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}\frac{z^n}{n!}</math><br />
<br />
<nowiki> <math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z)<br />
= \sum_{n=0}^\infty<br />
\frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}<br />
\frac{z^n}{n!}</math></nowiki><br />
<br />
===Fraction and small fraction===<br />
<math> \frac {a}{b}</math> &emsp; <math> \tfrac {a}{b} </math><br />
<nowiki><math> \frac {a}{b}\ \tfrac {a}{b} </math></nowiki><br />
<br />
</center><br />
<br />
===Unicode vs TeX comparison===<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 255pt; border-collapse: collapse;" width="340"> <br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; width: 48pt; height: 12.75pt; background-color: transparent;" width="64">unicode</td><br />
<td style="border: medium none #f0f0f0; width: 104pt; background-color: transparent;" width="139">TeX</td><br />
<td style="border: medium none #f0f0f0; width: 103pt; background-color: transparent;" width="137">See</td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">[\![</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>[\![</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\{</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\{</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\|</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\|</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\}</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\}</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\aleph</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\aleph</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">α</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\alpha</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\alpha</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨿</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\amalg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\amalg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\angle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\angle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ast</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ast</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≍</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">\</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\backslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\backslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">β</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\beta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\beta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcirc</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcirc</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigodot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigodot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigoplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigoplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigotimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigotimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigsqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigsqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangledown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangledown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangleup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangleup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\biguplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\biguplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigwedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigwedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigvee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigvee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bowtie</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bowtie</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">□</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Box</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Box</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bullet</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bullet</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">χ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\chi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\chi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\circ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\circ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\clubsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\clubsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\coprod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\coprod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">†</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dashv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dashv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">‡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamondsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamondsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">÷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\div</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\div</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\doteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\doteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℓ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ell</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ell</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\emptyset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\emptyset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\epsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\epsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">η</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\eta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\eta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\exists</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\exists</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\flat</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\flat</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\forall</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\forall</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\frown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\frown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gets</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gets</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℏ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hbar</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hbar</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\heartsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\heartsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Im</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Im</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ı</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\imath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\imath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\in</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\in</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∞</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\infty</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\infty</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\int</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\int</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ι</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\iota</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\iota</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">j</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\jmath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\jmath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">κ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\kappa</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\kappa</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\land</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\land</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle\!\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle\!\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">[</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\le</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\le</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌊</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ll</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ll</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lnot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lnot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟸</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟵</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longmapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longmapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟹</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟶</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mid</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mid</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\models</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\models</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">μ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nabla</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nabla</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\natural</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\natural</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ne</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ne</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nearrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nearrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ni</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ni</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≰</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not=</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not=</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ν</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nwarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nwarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\odot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\odot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oint</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oint</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ominus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ominus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\otimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\otimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\parallel</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\parallel</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\partial</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\partial</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\perp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\perp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϕ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">±</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pm</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pm</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">′</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prime</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prime</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∝</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\propto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\propto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle\!\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle\!\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">]</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℜ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Re</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Re</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ρ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇌</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightleftharpoons</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightleftharpoons</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\searrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\searrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\setminus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\setminus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sharp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sharp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\smile</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\smile</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\spadesuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\spadesuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\star</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\star</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≻</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sum</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sum</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">√</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\surd</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\surd</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\swarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\swarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">τ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\tau</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\tau</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">×</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\times</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\times</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\to</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\to</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\top</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\top</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleleft</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleleft</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleright</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleright</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊎</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ε</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varepsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varepsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varphi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varphi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϖ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varpi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varpi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϱ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varrho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varrho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ς</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varsigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varsigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vartheta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vartheta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">℘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wr</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wr</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ζ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\zeta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\zeta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">]\!]</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>]\!]</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ο</td><br />
<td style="background-color: transparent; border: #f0f0f0;">o</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>o</math></td><br />
</tr><br />
</table></div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:MediaWiki_TeX_test&diff=82736
Development:MediaWiki TeX test
2011-04-13T22:53:07Z
<p>Stronk7: </p>
<hr />
<div>This should look like some maths:<br />
<br />
<math>\int_{-\infty}^\infty e^{-x^{tim}}\,dx = \sqrt{hunt^3}</math><br />
<br />
(This page was created for the benefit of MDLSITE-649.)<br />
<br />
Heavy test:<br />
<br />
== Functions, symbols, special characters ==<br />
<br />
<!-- Eight symbols per line seems to be optimal--><br />
{| class="wikitable"<br />
! colspan="2" |<h3>Accents/Diacritics</h3><br />
|-<br />
|<code>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}</code><br />
|<math>\acute{a} \grave{a} \hat{a} \tilde{a} \breve{a}\,\!</math><br />
|-<br />
|<code>\check{a} \bar{a} \ddot{a} \dot{a}</code><br />
|<math>\check{a} \bar{a} \ddot{a} \dot{a}\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Standard functions</h3><br />
|-<br />
|<code>\sin a \cos b \tan c</code><br />
|<math>\sin a \cos b \tan c\!</math><br />
|-<br />
|<code>\sec d \csc e \cot f</code><br />
|<math>\sec d \csc e \cot f\,\!</math><br />
|-<br />
|<code>\arcsin h \arccos i \arctan j</code><br />
|<math>\arcsin h \arccos i \arctan j\,\!</math><br />
|-<br />
|<code>\sinh k \cosh l \tanh m \coth n\!</code><br />
|<math>\sinh k \cosh l \tanh m \coth n\!</math><br />
|-<br />
|<code>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</code><br />
|<math>\operatorname{sh}\,o\,\operatorname{ch}\,p\,\operatorname{th}\,q\!</math><br />
|-<br />
|<code>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t</code><br />
|<math>\operatorname{arsinh}\,r\,\operatorname{arcosh}\,s\,\operatorname{artanh}\,t\,\!</math><br />
|-<br />
|<code>\lim u \limsup v \liminf w \min x \max y\!</code><br />
|<math>\lim u \limsup v \liminf w \min x \max y\!</math><br />
|-<br />
|<code>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</code><br />
|<math>\inf z \sup a \exp b \ln c \lg d \log e \log_{10} f \ker g\!</math><br />
|-<br />
|<code>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n</code><br />
|<math>\deg h \gcd i \Pr j \det k \hom l \arg m \dim n\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Modular arithmetic</h3><br />
|-<br />
|<code>s_k \equiv 0 \pmod{m}</code><br />
|<math>s_k \equiv 0 \pmod{m}\,\!</math><br />
|-<br />
|<code>a\,\bmod\,b</code><br />
|<math>a\,\bmod\,b\,\!</math><br />
|-<br />
! colspan="2" | <h3>Derivatives</h3><br />
|-<br />
|<code>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</code><br />
|<math>\nabla \, \partial x \, dx \, \dot x \, \ddot y\, dy/dx\, \frac{dy}{dx}\, \frac{\partial^2 y}{\partial x_1\,\partial x_2}</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Sets</h3><br />
|-<br />
|<code>\forall \exists \empty \emptyset \varnothing</code><br />
|<math>\forall \exists \empty \emptyset \varnothing\,\!</math><br />
|-<br />
|<code>\in \ni \not \in \notin \subset \subseteq \supset \supseteq</code><br />
|<math>\in \ni \not \in \notin \subset \subseteq \supset \supseteq\,\!</math><br />
|-<br />
|<code>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus</code><br />
|<math>\cap \bigcap \cup \bigcup \biguplus \setminus \smallsetminus\,\!</math><br />
|-<br />
|<code>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup</code><br />
|<math>\sqsubset \sqsubseteq \sqsupset \sqsupseteq \sqcap \sqcup \bigsqcup\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Operators</h3><br />
|-<br />
|<code>+ \oplus \bigoplus \pm \mp - </code><br />
|<math>+ \oplus \bigoplus \pm \mp - \,\!</math><br />
|-<br />
|<code>\times \otimes \bigotimes \cdot \circ \bullet \bigodot</code><br />
|<math>\times \otimes \bigotimes \cdot \circ \bullet \bigodot\,\!</math><br />
|-<br />
|<code>\star * / \div \frac{1}{2}</code><br />
|<math>\star * / \div \frac{1}{2}\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Logic</h3><br />
|-<br />
|<code>\land (or \and) \wedge \bigwedge \bar{q} \to p</code><br />
|<math>\land \wedge \bigwedge \bar{q} \to p\,\!</math><br />
|-<br />
|<code>\lor \vee \bigvee \lnot \neg q \And</code><br />
|<math>\lor \vee \bigvee \lnot \neg q \And\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Root</h3><br />
|-<br />
|<code>\sqrt{2} \sqrt[n]{x}</code><br />
|<math>\sqrt{2} \sqrt[n]{x}\,\!</math><br />
|-<br />
! colspan="2" | <h3>Relations</h3><br />
|-<br />
|<code>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}</code><br />
|<math>\sim \approx \simeq \cong \dot= \overset{\underset{\mathrm{def}}{}}{=}\,\!</math><br />
|-<br />
|<code>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto</code><br />
|<math>\le < \ll \gg \ge > \equiv \not\equiv \ne \mbox{or} \neq \propto\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Geometric</h3><br />
|-<br />
|<code><nowiki>\Diamond \Box \triangle \angle \perp \mid \nmid \| 45^\circ</nowiki></code><br />
|<math>\Diamond \, \Box \, \triangle \, \angle \perp \, \mid \; \nmid \, \| 45^\circ\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Arrows</h3><br />
|-<br />
|<code>\leftarrow (or \gets) \rightarrow (or \to) \nleftarrow \nrightarrow \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow</code><br />
|<math>\leftarrow \rightarrow \nleftarrow \not\to \leftrightarrow \nleftrightarrow \longleftarrow \longrightarrow \longleftrightarrow \,\!</math><br />
|-<br />
|<code>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow (or \iff)</code><br />
|<math>\Leftarrow \Rightarrow \nLeftarrow \nRightarrow \Leftrightarrow \nLeftrightarrow \Longleftarrow \Longrightarrow \Longleftrightarrow \!</math><br />
|-<br />
|<code>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow</code><br />
|<math>\uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow \nearrow \searrow \swarrow \nwarrow \!</math><br />
|-<br />
|<code>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons</code><br />
|<math>\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons \,\!</math><br />
|-<br />
|<code>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright</code><br />
|<math>\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \Rrightarrow \rightarrowtail \looparrowright \,\!</math><br />
|-<br />
|<code>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft</code><br />
|<math>\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \Lleftarrow \leftarrowtail \looparrowleft \,\!</math><br />
|-<br />
|<code>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow </code><br />
|<math>\mapsto \longmapsto \hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow \,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Special</h3><br />
|-<br />
|<code>\And \eth \S \P \% \dagger \ddagger \ldots \cdots</code><br />
|<math>\And \eth \S \P \% \dagger \ddagger \ldots \cdots\,\!</math><br />
|-<br />
|<code>\smile \frown \wr \triangleleft \triangleright \infty \bot \top</code><br />
|<math>\smile \frown \wr \triangleleft \triangleright \infty \bot \top\,\!</math><br />
|-<br />
|<code>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar</code><br />
|<math>\vdash \vDash \Vdash \models \lVert \rVert \imath \hbar\,\!</math><br />
|-<br />
|<code>\ell \mho \Finv \Re \Im \wp \complement</code><br />
|<math>\ell \mho \Finv \Re \Im \wp \complement\,\!</math><br />
|-<br />
|<code>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp</code><br />
|<math>\diamondsuit \heartsuit \clubsuit \spadesuit \Game \flat \natural \sharp\,\!</math><br />
|-<br />
! colspan="2" |<br />
<br />
<h3>Unsorted (new stuff)</h3><br />
|-<br />
|<code> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</code><br />
|<math> \vartriangle \triangledown \lozenge \circledS \measuredangle \nexists \Bbbk \backprime \blacktriangle \blacktriangledown</math><br />
|-<br />
|<code> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge</code><br />
|<math> \blacksquare \blacklozenge \bigstar \sphericalangle \diagup \diagdown \dotplus \Cap \Cup \barwedge\!</math><br />
|-<br />
|<code> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</code><br />
|<math> \veebar \doublebarwedge \boxminus \boxtimes \boxdot \boxplus \divideontimes \ltimes \rtimes \leftthreetimes</math><br />
|-<br />
|<code> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</code><br />
|<math> \rightthreetimes \curlywedge \curlyvee \circleddash \circledast \circledcirc \centerdot \intercal \leqq \leqslant</math><br />
|-<br />
|<code> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</code><br />
|<math> \eqslantless \lessapprox \approxeq \lessdot \lll \lessgtr \lesseqgtr \lesseqqgtr \doteqdot \risingdotseq</math><br />
|-<br />
|<code> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</code><br />
|<math> \fallingdotseq \backsim \backsimeq \subseteqq \Subset \preccurlyeq \curlyeqprec \precsim \precapprox \vartriangleleft</math><br />
|-<br />
|<code> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</code><br />
|<math> \Vvdash \bumpeq \Bumpeq \geqq \geqslant \eqslantgtr \gtrsim \gtrapprox \eqsim \gtrdot</math><br />
|-<br />
|<code> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</code><br />
|<math> \ggg \gtrless \gtreqless \gtreqqless \eqcirc \circeq \triangleq \thicksim \thickapprox \supseteqq</math><br />
|-<br />
|<code> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</code><br />
|<math> \Supset \succcurlyeq \curlyeqsucc \succsim \succapprox \vartriangleright \shortmid \shortparallel \between \pitchfork</math><br />
|-<br />
|<code> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</code><br />
|<math> \varpropto \blacktriangleleft \therefore \backepsilon \blacktriangleright \because \nleqslant \nleqq \lneq \lneqq</math><br />
|-<br />
|<code> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</code><br />
|<math> \lvertneqq \lnsim \lnapprox \nprec \npreceq \precneqq \precnsim \precnapprox \nsim \nshortmid</math><br />
|-<br />
|<code> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</code><br />
|<math> \nvdash \nVdash \ntriangleleft \ntrianglelefteq \nsubseteq \nsubseteqq \varsubsetneq \subsetneqq \varsubsetneqq \ngtr</math><br />
|-<br />
|<code>\subsetneq</code><br />
|<math>\subsetneq</math><br />
|-<br />
|<code> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</code><br />
|<math> \ngeqslant \ngeqq \gneq \gneqq \gvertneqq \gnsim \gnapprox \nsucc \nsucceq \succneqq</math><br />
|-<br />
|<code> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</code><br />
|<math> \succnsim \succnapprox \ncong \nshortparallel \nparallel \nvDash \nVDash \ntriangleright \ntrianglerighteq \nsupseteq</math><br />
|-<br />
|<code> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</code><br />
|<math> \nsupseteqq \varsupsetneq \supsetneqq \varsupsetneqq</math><br />
|-<br />
|<code>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus</code><br />
|<math>\jmath \surd \ast \uplus \diamond \bigtriangleup \bigtriangledown \ominus\,\!</math><br />
|-<br />
|<code>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq</code><br />
|<math>\oslash \odot \bigcirc \amalg \prec \succ \preceq \succeq\,\!</math><br />
|-<br />
|<code>\dashv \asymp \doteq \parallel</code><br />
|<math>\dashv \asymp \doteq \parallel\,\!</math><br />
|-<br />
|<code>\ulcorner \urcorner \llcorner \lrcorner</code><br />
|<math>\ulcorner \urcorner \llcorner \lrcorner</math><br />
|}<br />
<br />
== Larger Expressions ==<br />
=== Subscripts, superscripts, integrals ===<br />
{| border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"<br />
!rowspan="2"|Feature!!rowspan="2"|Syntax!!colspan="2"|How it looks rendered<br />
|-<br />
!HTML!!PNG<br />
|-<br />
|-<br />
|Superscript||<code>a^2</code>||<math>a^2</math>||<math>a^2 \,\!</math><br />
|-<br />
|Subscript||<code>a_2</code>||<math>a_2</math>||<math>a_2 \,\!</math><br />
|-<br />
|rowspan=2|Grouping||<code>a^{2+2}</code>||<math>a^{2+2}</math>||<math>a^{2+2}\,\!</math><br />
|-<br />
|<code>a_{i,j}</code>||<math>a_{i,j}</math>||<math>a_{i,j}\,\!</math><br />
|-<br />
|rowspan=2|Combining sub & super without and with horizontal separation||<code>x_2^3</code>||<math>x_2^3</math>||<math>x_2^3 \,\!</math><br />
|-<br />
|<code>{x_2}^3</code>||<math>{x_2}^3</math>||<math>{x_2}^3 \,\!</math><br />
|-<br />
|Super super||<code>10^{10^{ \,\!{8} }</code>||colspan=2|<math>10^{10^{ \,\! 8 } }</math><br />
|-<br />
|Super super||<code>10^{10^{ \overset{8}{} }}</code>||colspan=2|<math>10^{10^{ \overset{8}{} }}</math><br />
|-<br />
|Super super (wrong in HTML in some browsers)||<code>10^{10^8}</code> ||colspan=2|<math>10^{10^8}</math><br />
|-<br />
|rowspan="2"|Preceding and/or Additional sub & super||<code>\sideset{_1^2}{_3^4}\prod_a^b</code>||colspan=2|<math>\sideset{_1^2}{_3^4}\prod_a^b</math><br />
|-<br />
|<code>{}_1^2\!\Omega_3^4</code>||colspan=2|<math>{}_1^2\!\Omega_3^4</math><br />
|-<br />
|rowspan="4"|Stacking<br />
|<code>\overset{\alpha}{\omega}</code>||colspan="2"|<math>\overset{\alpha}{\omega}</math><br />
|-<br />
|<code>\underset{\alpha}{\omega}</code>||colspan="2"|<math>\underset{\alpha}{\omega}</math><br />
|-<br />
|<code>\overset{\alpha}{\underset{\gamma}{\omega}}</code>||colspan="2"|<math>\overset{\alpha}{\underset{\gamma}{\omega}}</math><br />
|-<br />
|<code>\stackrel{\alpha}{\omega}</code>||colspan="2"|<math>\stackrel{\alpha}{\omega}</math><br />
|-<br />
|Derivative (forced PNG)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki>\!</code>||&nbsp;||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (f in italics may overlap primes in HTML)||<code>x', y<nowiki>''</nowiki>, f', f<nowiki>''</nowiki></code>||<math>x', y'', f', f''</math>||<math>x', y'', f', f''\!</math><br />
|-<br />
|Derivative (wrong in HTML)||<code>x^\prime, y^{\prime\prime}</code>||<math>x^\prime, y^{\prime\prime}</math>||<math>x^\prime, y^{\prime\prime}\,\!</math><br />
|-<br />
|Derivative (wrong in PNG)||<code>x\prime, y\prime\prime</code>||<math>x\prime, y\prime\prime</math>||<math>x\prime, y\prime\prime\,\!</math><br />
|-<br />
|Derivative dots||<code>\dot{x}, \ddot{x}</code>||colspan=2|<math>\dot{x}, \ddot{x}</math><br />
|-<br />
|rowspan="3"|Underlines, overlines, vectors||<code>\hat a \ \bar b \ \vec c</code>||colspan=2|<math>\hat a \ \bar b \ \vec c</math><br />
|-<br />
|<code>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</code>||colspan=2|<math>\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}</math><br />
|-<br />
|<code>\overline{g h i} \ \underline{j k l}</code>||colspan=2|<math>\overline{g h i} \ \underline{j k l}</math><br />
|-<br />
|Arrows||<code> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</code>||colspan=2|<math> A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} C</math><br />
|-<br />
|Overbraces||<code>\overbrace{ 1+2+\cdots+100 }^{5050}</code>||colspan=2|<math>\overbrace{ 1+2+\cdots+100 }^{5050}</math><br />
|-<br />
|Underbraces||<code>\underbrace{ a+b+\cdots+z }_{26}</code>||colspan=2|<math>\underbrace{ a+b+\cdots+z }_{26}</math><br />
|-<br />
|Sum||<code>\sum_{k=1}^N k^2</code>||colspan=2|<math>\sum_{k=1}^N k^2</math><br />
|-<br />
|Sum (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \sum_{k=1}^N k^2 </code>||colspan=2|<math>\textstyle \sum_{k=1}^N k^2</math><br />
|-<br />
|Product||<code>\prod_{i=1}^N x_i</code>||colspan=2|<math>\prod_{i=1}^N x_i</math><br />
|-<br />
|Product (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \prod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \prod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct||<code>\coprod_{i=1}^N x_i</code>||colspan=2|<math>\coprod_{i=1}^N x_i</math><br />
|-<br />
|Coproduct (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \coprod_{i=1}^N x_i</code>||colspan=2|<math>\textstyle \coprod_{i=1}^N x_i</math><br />
|-<br />
|Limit||<code>\lim_{n \to \infty}x_n</code>||colspan=2|<math>\lim_{n \to \infty}x_n</math><br />
|-<br />
|Limit (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \lim_{n \to \infty}x_n</code>||colspan=2|<math>\textstyle \lim_{n \to \infty}x_n</math><br />
|-<br />
|Integral||<code>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (alternate limits style)||<code>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</code>||colspan=2|<math>\int_{1}^{3}\frac{e^3/x}{x^2}\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>)||<code>\textstyle \int\limits_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int\limits_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Integral (force&nbsp;<code>\textstyle</code>, alternate limits style)||<code>\textstyle \int_{-N}^{N} e^x\, dx</code>||colspan=2|<math>\textstyle \int_{-N}^{N} e^x\, dx</math><br />
|-<br />
|Double integral||<code>\iint\limits_D \, dx\,dy</code>||colspan=2|<math>\iint\limits_D \, dx\,dy</math><br />
|-<br />
|Triple integral||<code>\iiint\limits_E \, dx\,dy\,dz</code>||colspan=2|<math>\iiint\limits_E \, dx\,dy\,dz</math><br />
|-<br />
|Quadruple integral||<code>\iiiint\limits_F \, dx\,dy\,dz\,dt</code>||colspan=2|<math>\iiiint\limits_F \, dx\,dy\,dz\,dt</math><br />
|-<br />
|Line or path integral||<code>\int_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\int_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Closed line or path integral||<code>\oint_C x^3\, dx + 4y^2\, dy</code>||colspan=2|<math>\oint_C x^3\, dx + 4y^2\, dy</math><br />
|-<br />
|Intersections||<code>\bigcap_1^n p</code>||colspan=2|<math>\bigcap_1^n p</math><br />
|-<br />
|Unions||<code>\bigcup_1^k p</code>||colspan=2|<math>\bigcup_1^k p</math><br />
|}<br />
<br />
=== Fractions, matrices, multilines ===<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>Fractions</td><br />
<td><code>\frac{2}{4}=0.5</code></td><br />
<td><math>\frac{2}{4}=0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Small Fractions</td><br />
<td><code>\tfrac{2}{4} = 0.5</code></td><br />
<td><math>\tfrac{2}{4} = 0.5</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (normal) Fractions</td><br />
<td><code>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a </code></td><br />
<td><math>\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Large (nested) Fractions</td><br />
<td><code>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</code></td><br />
<td><math>\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Binomial coefficients</td><br />
<td><code>\binom{n}{k}</code></td><br />
<td><math>\binom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Small Binomial coefficients</td><br />
<td><code>\tbinom{n}{k}</code></td><br />
<td><math>\tbinom{n}{k}</math></td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>Large (normal) Binomial coefficients</td><br />
<td><code>\dbinom{n}{k}</code></td><br />
<td><math>\dbinom{n}{k}</math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="7">Matrices</td><br />
<td><pre>\begin{matrix}<br />
x & y \\<br />
z & v <br />
\end{matrix}</pre></td><br />
<td><math>\begin{matrix} x & y \\ z & v<br />
\end{matrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{vmatrix}<br />
x & y \\<br />
z & v <br />
\end{vmatrix}</pre></td><br />
<td><math>\begin{vmatrix} x & y \\ z & v<br />
\end{vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Vmatrix}<br />
x & y \\<br />
z & v<br />
\end{Vmatrix}</pre></td><br />
<td><math>\begin{Vmatrix} x & y \\ z & v<br />
\end{Vmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{bmatrix}<br />
0 & \cdots & 0 \\<br />
\vdots & \ddots & \vdots \\ <br />
0 & \cdots & 0<br />
\end{bmatrix}</pre></td><br />
<td><math>\begin{bmatrix} 0 & \cdots & 0 \\ \vdots<br />
& \ddots & \vdots \\ 0 & \cdots &<br />
0\end{bmatrix} </math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{Bmatrix}<br />
x & y \\<br />
z & v<br />
\end{Bmatrix}</pre></td><br />
<td><math>\begin{Bmatrix} x & y \\ z & v<br />
\end{Bmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre>\begin{pmatrix}<br />
x & y \\<br />
z & v <br />
\end{pmatrix}</pre></td><br />
<td><math>\begin{pmatrix} x & y \\ z & v<br />
\end{pmatrix}</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</pre></td><br />
<td><math><br />
\bigl( \begin{smallmatrix}<br />
a&b\\ c&d<br />
\end{smallmatrix} \bigr)<br />
</math></td><br />
</tr><br />
<br />
<br />
<br />
<tr><br />
<td>Case distinctions</td><br />
<td><pre><br />
f(n) = <br />
\begin{cases} <br />
n/2, & \mbox{if }n\mbox{ is even} \\<br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases}</pre></td><br />
<td><math>f(n) = <br />
\begin{cases}<br />
n/2, & \mbox{if }n\mbox{ is even} \\ <br />
3n+1, & \mbox{if }n\mbox{ is odd} <br />
\end{cases} </math></td><br />
</tr><br />
<br />
<tr><br />
<td rowspan="2">Multiline equations</td><br />
<td><pre><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</pre></td><br />
<td><math><br />
\begin{align}<br />
f(x) & = (a+b)^2 \\<br />
& = a^2+2ab+b^2 \\<br />
\end{align}<br />
</math></td><br />
</tr><br />
<br />
<tr><br />
<td><pre><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</pre></td><br />
<td><math><br />
\begin{alignat}{2}<br />
f(x) & = (a-b)^2 \\<br />
& = a^2-2ab+b^2 \\<br />
\end{alignat}<br />
</math></td><br />
</tr><br />
<tr><br />
<td>Multiline equations <small>(must define number of colums used ({lcr}) <small>(should not be used unless needed)</small></small></td><br />
<td><pre><br />
\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcl}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Multiline equations (more)</td><br />
<td><pre><br />
\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</pre></td><br />
<td><math>\begin{array}{lcr}<br />
z & = & a \\<br />
f(x,y,z) & = & x + y + z <br />
\end{array}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Breaking up a long expression so that it wraps when necessary, at the expense of destroying correct spacing</td><br />
<td><pre><br />
<nowiki><br />
<math>f(x) \,\!</math><br />
<math>= \sum_{n=0}^\infty a_n x^n </math><br />
<math>= a_0+a_1x+a_2x^2+\cdots</math><br />
</nowiki><br />
</pre><br />
</td><br />
<td><br />
<math>f(x) \,\!</math><math>= \sum_{n=0}^\infty a_n x^n </math><math>= a_0 +a_1x+a_2x^2+\cdots</math><br />
</td><br />
</tr><br />
<br />
<tr><br />
<td>Simultaneous equations</td><br />
<td><pre>\begin{cases}<br />
3x + 5y + z \\<br />
7x - 2y + 4z \\<br />
-6x + 3y + 2z <br />
\end{cases}</pre></td><br />
<td><math>\begin{cases} 3x + 5y + z \\ 7x - 2y + 4z \\ -6x + 3y + 2z \end{cases}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>Arrays</td><br />
<td><pre><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</pre></td><br />
<td><math><br />
\begin{array}{|c|c||c|} a & b & S \\<br />
\hline<br />
0&0&1\\<br />
0&1&1\\<br />
1&0&1\\<br />
1&1&0\\<br />
\end{array}<br />
</math></td><br />
</tr><br />
</table><br />
<br />
=== Parenthesizing big expressions, brackets, bars ===<br />
{| class="wikitable"<br />
! Feature !! Syntax !! How it looks rendered<br />
|-<br />
| Bad<br />
| <code>( \frac{1}{2} )</code><br />
| <math>( \frac{1}{2} )</math><br />
|-<br />
| Good<br />
| <code>\left ( \frac{1}{2} \right )</code><br />
| <math>\left ( \frac{1}{2} \right )</math><br />
|}<br />
<br />
You can use various delimiters with \left and \right: <br />
<br />
{| class="wikitable"<br />
! Feature<br />
! Syntax<br />
! How it looks rendered<br />
|-<br />
| Parentheses<br />
| <code>\left ( \frac{a}{b} \right )</code><br />
| <math>\left ( \frac{a}{b} \right )</math><br />
|-<br />
| Brackets<br />
| <code>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</code><br />
| <math>\left [ \frac{a}{b} \right ] \quad \left \lbrack \frac{a}{b} \right \rbrack</math><br />
|-<br />
| Braces<br />
| <code>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</code><br />
| <math>\left \{ \frac{a}{b} \right \} \quad \left \lbrace \frac{a}{b} \right \rbrace</math><br />
|-<br />
| Angle brackets<br />
| <code>\left \langle \frac{a}{b} \right \rangle</code><br />
| <math>\left \langle \frac{a}{b} \right \rangle</math><br />
|-<br />
| Bars and double bars<br />
| <code><nowiki>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</nowiki></code><br />
| <math>\left | \frac{a}{b} \right \vert \left \Vert \frac{c}{d} \right \|</math><br />
|-<br />
| Floor and ceiling functions:<br />
| <code>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</code><br />
| <math>\left \lfloor \frac{a}{b} \right \rfloor \left \lceil \frac{c}{d} \right \rceil</math><br />
|-<br />
| Slashes and backslashes<br />
| <code>\left / \frac{a}{b} \right \backslash</code><br />
| <math>\left / \frac{a}{b} \right \backslash</math><br />
|-<br />
| Up, down and up-down arrows<br />
| <code>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</code><br />
| <math>\left \uparrow \frac{a}{b} \right \downarrow \quad \left \Uparrow \frac{a}{b} \right \Downarrow \quad \left \updownarrow \frac{a}{b} \right \Updownarrow</math><br />
|-<br />
| Delimiters can be mixed,<br/>as long as \left and \right match<br />
| <code><nowiki>\left [ 0,1 \right )</code> <br/> <code>\left \langle \psi \right |</nowiki></code><br />
| <math>\left [ 0,1 \right )</math> <br/> <math>\left \langle \psi \right |</math><br />
|-<br />
| Use \left. and \right. if you don't<br/>want a delimiter to appear:<br />
| <code>\left . \frac{A}{B} \right \} \to X</code><br />
| <math>\left . \frac{A}{B} \right \} \to X</math><br />
|-<br />
| rowspan="7" | Size of the delimiters<br />
| <code>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]/<code><br />
| <math>\big( \Big( \bigg( \Bigg( \dots \Bigg] \bigg] \Big] \big]</math><br />
|-<br />
| <code>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</code><br />
| <math>\big\{ \Big\{ \bigg\{ \Bigg\{ \dots \Bigg\rangle \bigg\rangle \Big\rangle \big\rangle</math><br />
|-<br />
| <code><nowiki>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</nowiki></code><br />
| <math>\big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big|</math><br />
|-<br />
| <code>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</code><br />
| <math>\big\lfloor \Big\lfloor \bigg\lfloor \Bigg\lfloor \dots \Bigg\rceil \bigg\rceil \Big\rceil \big\rceil</math><br />
|-<br />
| <code>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</code><br />
| <math>\big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow</math><br />
|-<br />
| <code>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</code><br />
| <math>\big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow</math><br />
|-<br />
| <code>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</code><br />
| <math>\big / \Big / \bigg / \Bigg / \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash</math><br />
|}<br />
<br />
== Alphabets and typefaces == <br />
[[w:Texvc|Texvc]] cannot render arbitrary [[w:Unicode|Unicode]] characters. Those it can handle can be entered by the expressions below.<br />
For others, such as [[w:Cyrillic|Cyrillic]], they can be entered as Unicode or HTML entities in running text, but cannot be used in displayed formulas.<br />
<br />
{| class="wikitable"<br />
! colspan="2" | Greek alphabet<br />
|-<br />
|<code><nowiki>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta</nowiki></code><br />
|<math>\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \,\!</math><br />
|-<br />
|<code><nowiki>\Eta \Theta \Iota \Kappa \Lambda \Mu</nowiki></code><br />
|<math>\Eta \Theta \Iota \Kappa \Lambda \Mu \,\!</math><br />
|-<br />
|<code><nowiki>\Nu \Xi \Pi \Rho \Sigma \Tau</nowiki></code><br />
|<math>\Nu \Xi \Pi \Rho \Sigma \Tau\,\!</math><br />
|-<br />
|<code><nowiki>\Upsilon \Phi \Chi \Psi \Omega</nowiki></code><br />
|<math>\Upsilon \Phi \Chi \Psi \Omega \,\!</math><br />
|-<br />
|<code><nowiki>\alpha \beta \gamma \delta \epsilon \zeta</nowiki></code><br />
|<math>\alpha \beta \gamma \delta \epsilon \zeta \,\!</math><br />
|-<br />
|<code><nowiki>\eta \theta \iota \kappa \lambda \mu</nowiki></code><br />
|<math>\eta \theta \iota \kappa \lambda \mu \,\!</math><br />
|-<br />
|<code><nowiki>\nu \xi \pi \rho \sigma \tau</nowiki></code><br />
|<math>\nu \xi \pi \rho \sigma \tau \,\!</math><br />
|-<br />
|<code><nowiki>\upsilon \phi \chi \psi \omega</nowiki></code><br />
|<math>\upsilon \phi \chi \psi \omega \,\!</math><br />
|-<br />
|<code><nowiki>\varepsilon \digamma \vartheta \varkappa</nowiki></code><br />
|<math>\varepsilon \digamma \vartheta \varkappa \,\!</math><br />
|-<br />
|<code><nowiki>\varpi \varrho \varsigma \varphi</nowiki></code><br />
|<math>\varpi \varrho \varsigma \varphi\,\!</math><br />
|-<br />
! colspan="2" | Blackboard Bold/Scripts<br />
|-<br />
|<code><nowiki>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G}</nowiki></code><br />
|<math>\mathbb{A} \mathbb{B} \mathbb{C} \mathbb{D} \mathbb{E} \mathbb{F} \mathbb{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M}</nowiki></code><br />
|<math>\mathbb{H} \mathbb{I} \mathbb{J} \mathbb{K} \mathbb{L} \mathbb{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T}</nowiki></code><br />
|<math>\mathbb{N} \mathbb{O} \mathbb{P} \mathbb{Q} \mathbb{R} \mathbb{S} \mathbb{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}</nowiki></code><br />
|<math>\mathbb{U} \mathbb{V} \mathbb{W} \mathbb{X} \mathbb{Y} \mathbb{Z}\,\!</math><br />
|-<br />
! colspan="2" | boldface (vectors)<br />
|-<br />
|<code><nowiki>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G}</nowiki></code><br />
|<math>\mathbf{A} \mathbf{B} \mathbf{C} \mathbf{D} \mathbf{E} \mathbf{F} \mathbf{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M}</nowiki></code><br />
|<math>\mathbf{H} \mathbf{I} \mathbf{J} \mathbf{K} \mathbf{L} \mathbf{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T}</nowiki></code><br />
|<math>\mathbf{N} \mathbf{O} \mathbf{P} \mathbf{Q} \mathbf{R} \mathbf{S} \mathbf{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z}</nowiki></code><br />
|<math>\mathbf{U} \mathbf{V} \mathbf{W} \mathbf{X} \mathbf{Y} \mathbf{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g}</nowiki></code><br />
|<math>\mathbf{a} \mathbf{b} \mathbf{c} \mathbf{d} \mathbf{e} \mathbf{f} \mathbf{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m}</nowiki></code><br />
|<math>\mathbf{h} \mathbf{i} \mathbf{j} \mathbf{k} \mathbf{l} \mathbf{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t}</nowiki></code><br />
|<math>\mathbf{n} \mathbf{o} \mathbf{p} \mathbf{q} \mathbf{r} \mathbf{s} \mathbf{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z}</nowiki></code><br />
|<math>\mathbf{u} \mathbf{v} \mathbf{w} \mathbf{x} \mathbf{y} \mathbf{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4}</nowiki></code><br />
|<math>\mathbf{0} \mathbf{1} \mathbf{2} \mathbf{3} \mathbf{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}</nowiki></code><br />
|<math>\mathbf{5} \mathbf{6} \mathbf{7} \mathbf{8} \mathbf{9}\,\!</math><br />
|-<br />
! colspan="2" | Boldface (greek)<br />
|-<br />
|<code><nowiki>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta}</nowiki></code><br />
|<math>\boldsymbol{\Alpha} \boldsymbol{\Beta} \boldsymbol{\Gamma} \boldsymbol{\Delta} \boldsymbol{\Epsilon} \boldsymbol{\Zeta} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}</nowiki></code><br />
|<math>\boldsymbol{\Eta} \boldsymbol{\Theta} \boldsymbol{\Iota} \boldsymbol{\Kappa} \boldsymbol{\Lambda} \boldsymbol{\Mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}</nowiki></code><br />
|<math>\boldsymbol{\Nu} \boldsymbol{\Xi} \boldsymbol{\Pi} \boldsymbol{\Rho} \boldsymbol{\Sigma} \boldsymbol{\Tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}</nowiki></code><br />
|<math>\boldsymbol{\Upsilon} \boldsymbol{\Phi} \boldsymbol{\Chi} \boldsymbol{\Psi} \boldsymbol{\Omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}</nowiki></code><br />
|<math>\boldsymbol{\alpha} \boldsymbol{\beta} \boldsymbol{\gamma} \boldsymbol{\delta} \boldsymbol{\epsilon} \boldsymbol{\zeta}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}</nowiki></code><br />
|<math>\boldsymbol{\eta} \boldsymbol{\theta} \boldsymbol{\iota} \boldsymbol{\kappa} \boldsymbol{\lambda} \boldsymbol{\mu}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}</nowiki></code><br />
|<math>\boldsymbol{\nu} \boldsymbol{\xi} \boldsymbol{\pi} \boldsymbol{\rho} \boldsymbol{\sigma} \boldsymbol{\tau}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}</nowiki></code><br />
|<math>\boldsymbol{\upsilon} \boldsymbol{\phi} \boldsymbol{\chi} \boldsymbol{\psi} \boldsymbol{\omega}\,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa}</nowiki></code><br />
|<math>\boldsymbol{\varepsilon} \boldsymbol{\digamma} \boldsymbol{\vartheta} \boldsymbol{\varkappa} \,\!</math><br />
|-<br />
|<code><nowiki>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}</nowiki></code><br />
|<math>\boldsymbol{\varpi} \boldsymbol{\varrho} \boldsymbol{\varsigma} \boldsymbol{\varphi}\,\!</math><br />
|-<br />
! colspan="2" | Italics<br />
|-<br />
|<code><nowiki>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G}</nowiki></code><br />
|<math>\mathit{A} \mathit{B} \mathit{C} \mathit{D} \mathit{E} \mathit{F} \mathit{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M}</nowiki></code><br />
|<math>\mathit{H} \mathit{I} \mathit{J} \mathit{K} \mathit{L} \mathit{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T}</nowiki></code><br />
|<math>\mathit{N} \mathit{O} \mathit{P} \mathit{Q} \mathit{R} \mathit{S} \mathit{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z}</nowiki></code><br />
|<math>\mathit{U} \mathit{V} \mathit{W} \mathit{X} \mathit{Y} \mathit{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g}</nowiki></code><br />
|<math>\mathit{a} \mathit{b} \mathit{c} \mathit{d} \mathit{e} \mathit{f} \mathit{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m}</nowiki></code><br />
|<math>\mathit{h} \mathit{i} \mathit{j} \mathit{k} \mathit{l} \mathit{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t}</nowiki></code><br />
|<math>\mathit{n} \mathit{o} \mathit{p} \mathit{q} \mathit{r} \mathit{s} \mathit{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z}</nowiki></code><br />
|<math>\mathit{u} \mathit{v} \mathit{w} \mathit{x} \mathit{y} \mathit{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4}</nowiki></code><br />
|<math>\mathit{0} \mathit{1} \mathit{2} \mathit{3} \mathit{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}</nowiki></code><br />
|<math>\mathit{5} \mathit{6} \mathit{7} \mathit{8} \mathit{9}\,\!</math><br />
|-<br />
! colspan="2" | Roman typeface<br />
|-<br />
|<code><nowiki>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G}</nowiki></code><br />
|<math>\mathrm{A} \mathrm{B} \mathrm{C} \mathrm{D} \mathrm{E} \mathrm{F} \mathrm{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M}</nowiki></code><br />
|<math>\mathrm{H} \mathrm{I} \mathrm{J} \mathrm{K} \mathrm{L} \mathrm{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T}</nowiki></code><br />
|<math>\mathrm{N} \mathrm{O} \mathrm{P} \mathrm{Q} \mathrm{R} \mathrm{S} \mathrm{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z}</nowiki></code><br />
|<math>\mathrm{U} \mathrm{V} \mathrm{W} \mathrm{X} \mathrm{Y} \mathrm{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}</nowiki></code><br />
|<math>\mathrm{a} \mathrm{b} \mathrm{c} \mathrm{d} \mathrm{e} \mathrm{f} \mathrm{g}\,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m}</nowiki></code><br />
|<math>\mathrm{h} \mathrm{i} \mathrm{j} \mathrm{k} \mathrm{l} \mathrm{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t}</nowiki></code><br />
|<math>\mathrm{n} \mathrm{o} \mathrm{p} \mathrm{q} \mathrm{r} \mathrm{s} \mathrm{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z}</nowiki></code><br />
|<math>\mathrm{u} \mathrm{v} \mathrm{w} \mathrm{x} \mathrm{y} \mathrm{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4}</nowiki></code><br />
|<math>\mathrm{0} \mathrm{1} \mathrm{2} \mathrm{3} \mathrm{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}</nowiki></code><br />
|<math>\mathrm{5} \mathrm{6} \mathrm{7} \mathrm{8} \mathrm{9}\,\!</math><br />
|-<br />
! colspan="2" | Fraktur typeface<br />
|-<br />
|<code><nowiki>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G}</nowiki></code><br />
|<math>\mathfrak{A} \mathfrak{B} \mathfrak{C} \mathfrak{D} \mathfrak{E} \mathfrak{F} \mathfrak{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M}</nowiki></code><br />
|<math>\mathfrak{H} \mathfrak{I} \mathfrak{J} \mathfrak{K} \mathfrak{L} \mathfrak{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T}</nowiki></code><br />
|<math>\mathfrak{N} \mathfrak{O} \mathfrak{P} \mathfrak{Q} \mathfrak{R} \mathfrak{S} \mathfrak{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z}</nowiki></code><br />
|<math>\mathfrak{U} \mathfrak{V} \mathfrak{W} \mathfrak{X} \mathfrak{Y} \mathfrak{Z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g}</nowiki></code><br />
|<math>\mathfrak{a} \mathfrak{b} \mathfrak{c} \mathfrak{d} \mathfrak{e} \mathfrak{f} \mathfrak{g} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m}</nowiki></code><br />
|<math>\mathfrak{h} \mathfrak{i} \mathfrak{j} \mathfrak{k} \mathfrak{l} \mathfrak{m} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t}</nowiki></code><br />
|<math>\mathfrak{n} \mathfrak{o} \mathfrak{p} \mathfrak{q} \mathfrak{r} \mathfrak{s} \mathfrak{t} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z}</nowiki></code><br />
|<math>\mathfrak{u} \mathfrak{v} \mathfrak{w} \mathfrak{x} \mathfrak{y} \mathfrak{z} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4}</nowiki></code><br />
|<math>\mathfrak{0} \mathfrak{1} \mathfrak{2} \mathfrak{3} \mathfrak{4} \,\!</math><br />
|-<br />
|<code><nowiki>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}</nowiki></code><br />
|<math>\mathfrak{5} \mathfrak{6} \mathfrak{7} \mathfrak{8} \mathfrak{9}\,\!</math><br />
|-<br />
! colspan="2" | Calligraphy/Script<br />
|-<br />
|<code><nowiki>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G}</nowiki></code><br />
|<math>\mathcal{A} \mathcal{B} \mathcal{C} \mathcal{D} \mathcal{E} \mathcal{F} \mathcal{G} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M}</nowiki></code><br />
|<math>\mathcal{H} \mathcal{I} \mathcal{J} \mathcal{K} \mathcal{L} \mathcal{M} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T}</nowiki></code><br />
|<math>\mathcal{N} \mathcal{O} \mathcal{P} \mathcal{Q} \mathcal{R} \mathcal{S} \mathcal{T} \,\!</math><br />
|-<br />
|<code><nowiki>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}</nowiki></code><br />
|<math>\mathcal{U} \mathcal{V} \mathcal{W} \mathcal{X} \mathcal{Y} \mathcal{Z}\,\!</math><br />
|-<br />
! colspan="2" | Hebrew<br />
|-<br />
|<code><nowiki>\aleph \beth \gimel \daleth</nowiki></code><br />
|<math>\aleph \beth \gimel \daleth\,\!</math><br />
|}<br />
<br />
<table class="wikitable"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th colspan="2">How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>non-italicised characters</td><br />
<td>\mbox{abc}</td><br />
<td><math>\mbox{abc}</math></td><br />
<td><math>\mbox{abc} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (bad)</td><br />
<td>\mbox{if} n \mbox{is even}</td><br />
<td><math>\mbox{if} n \mbox{is even}</math></td><br />
<td><math>\mbox{if} n \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (good)</td><br />
<td>\mbox{if }n\mbox{ is even}</td><br />
<td><math>\mbox{if }n\mbox{ is even}</math></td><br />
<td><math>\mbox{if }n\mbox{ is even} \,\!</math></td><br />
</tr><br />
<br />
<tr><br />
<td>mixed italics (more legible: ~ is a non-breaking space, while "\ " forces a space)</td><br />
<td>\mbox{if}~n\ \mbox{is even}</td><br />
<td><math>\mbox{if}~n\ \mbox{is even}</math></td><br />
<td><math>\mbox{if}~n\ \mbox{is even} \,\!</math></td><br />
</tr><br />
<br />
</table><br />
<br />
== Color ==<br />
<br />
Equations can use color:<br />
<br />
*<code>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</code><br />
*:<math>{\color{Blue}x^2}+{\color{YellowOrange}2x}-{\color{OliveGreen}1}</math><br />
<br />
*<code>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</code><br />
*:<math>x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a}</math><br />
<br />
See here for [http://oregonstate.edu/%7Epeterseb/tex/samples/docs/color-package-demo.pdf all named colors] supported by LaTeX.<br />
<br />
Note that color should not be used as the ''only'' way to identify something, because it will become meaningless on black-and-white media or for color-blind people. See [[en:Wikipedia:Manual of Style#Color coding]].<br />
<br />
== Formatting issues ==<br />
=== Spacing ===<br />
Note that TeX handles most spacing automatically, but you may sometimes want manual control. <br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Feature</th><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>double quad space</td><br />
<td>a \qquad b</td><br />
<td><math>a \qquad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>quad space</td><br />
<td>a \quad b</td><br />
<td><math>a \quad b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space</td><br />
<td>a\ b</td><br />
<td><math>a\ b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>text space without PNG conversion</td><br />
<td>a \mbox{ } b</td><br />
<td><math>a \mbox{ } b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>large space</td><br />
<td>a\;b</td><br />
<td><math>a\;b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>medium space</td><br />
<td>a\&gt;b</td><br />
<td>[not supported]</td><br />
</tr><br />
<br />
<tr><br />
<td>small space</td><br />
<td>a\,b</td><br />
<td><math>a\,b</math></td><br />
</tr><br />
<br />
<tr><br />
<td>no space</td><br />
<td>ab</td><br />
<td><math>ab\,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>small negative space</td><br />
<td>a\!b</td><br />
<td><math>a\!b</math></td><br />
</tr><br />
<br />
</table><br />
<br />
=== Alignment with normal text flow ===<br />
Due to the default css<br />
<br />
<pre>img.tex { vertical-align: middle; }</pre><br />
<br />
an inline expression like <math>\int_{-N}^{N} e^x\, dx</math> should look good.<br />
<br />
If you need to align it otherwise, use <code><nowiki><math style="vertical-align:-100%;">...</math></nowiki></code> and play with the <code>vertical-align</code> argument until you get it right; however, how it looks may depend on the browser and the browser settings.<br />
<br />
Also note that if you rely on this workaround, if/when the rendering on the server gets fixed in future releases, as a result of this extra manual offset your formulae will suddenly be aligned incorrectly. So use it sparingly, if at all.<br />
<br />
=== Forced PNG rendering ===<br />
<br />
To force the formula to render as PNG, add <code>\,</code> (small space) at the end of the formula (where it is not rendered). This will force PNG if the user is in "HTML if simple" mode, but not for "HTML if possible" mode.<br />
<br />
You can also use <code>\,\!</code> (small space and negative space, which cancel out) anywhere inside the math tags. This ''does'' force PNG even in "HTML if possible" mode, unlike <code>\,</code>.<br />
<br />
This could be useful to keep the rendering of formulae in a proof consistent, for example, or to fix formulae that render incorrectly in HTML (at one time, a^{2+2} rendered with an extra underscore), or to demonstrate how something is rendered when it would normally show up as HTML (as in the examples above).<br />
<br />
For instance:<br />
<br />
<table border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;"><br />
<br />
<tr><br />
<th>Syntax</th><br />
<th>How it looks rendered</th><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2}</td><br />
<td><math>a^{c+2}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{c+2} \,</td><br />
<td><math>a^{c+2} \,</math></td><br />
</tr><br />
<br />
<tr><br />
<td>a^{\,\!c+2}</td><br />
<td><math>a^{\,\!c+2}</math> </td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}</td><br />
<td><math>a^{b^{c+2}}</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}} \,</td><br />
<td><math>a^{b^{c+2}} \,</math> (WRONG with option "HTML if possible or else PNG"!)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{c+2}}\approx 5</td><br />
<td><math>a^{b^{c+2}}\approx 5</math> (due to "<math>\approx</math>" correctly displayed, no code "\,\!" needed)</td><br />
</tr><br />
<br />
<tr><br />
<td>a^{b^{\,\!c+2}}</td><br />
<td><math>a^{b^{\,\!c+2}}</math></td><br />
</tr><br />
<br />
<tr><br />
<td>\int_{-N}^{N} e^x\, dx</td><br />
<td><math>\int_{-N}^{N} e^x\, dx</math></td><br />
</tr><br />
<br />
</table><br />
<br />
<br />
This has been tested with most of the formulae on this page, and seems to work perfectly.<br />
<br />
You might want to include a comment in the HTML so people don't "correct" the formula by removing it:<br />
<br />
:''<nowiki><!-- The \,\! is to keep the formula rendered as PNG instead of HTML. Please don't remove it.--></nowiki>''<br />
<br />
<br />
== Examples ==<br />
<br />
<center><br />
===Quadratic Polynomial===<br />
<math>ax^2 + bx + c = 0</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0</math></nowiki><br />
<br />
===Quadratic Polynomial (Force PNG Rendering)===<br />
<math>ax^2 + bx + c = 0\,\!</math><br />
<br />
<nowiki><math>ax^2 + bx + c = 0\,\!</math></nowiki><br />
<br />
===Quadratic Formula===<br />
<math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math><br />
<br />
<nowiki><math>x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}</math></nowiki><br />
<br />
===Tall Parentheses and Fractions ===<br />
<math>2 = \left( \frac{\left(3-x\right) \times 2}{3-x} \right)</math><br />
<br />
<nowiki><math>2 = \left(<br />
\frac{\left(3-x\right) \times 2}{3-x}<br />
\right)</math></nowiki><br />
<br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
<nowiki><br />
<math>S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}</math><br />
</nowiki><br />
<br />
===Integrals===<br />
<math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds = \int_a^x f(y)(x-y)\,dy</math><br />
<br />
<nowiki><math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds<br />
= \int_a^x f(y)(x-y)\,dy</math></nowiki><br />
<br />
===Summation===<br />
<math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}{3^m\left(m\,3^n+n\,3^m\right)}</math><br />
<br />
<nowiki><math>\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2\,n}<br />
{3^m\left(m\,3^n+n\,3^m\right)}</math></nowiki><br />
<br />
=== Differential Equation ===<br />
<math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math><br />
<br />
<nowiki><math>u'' + p(x)u' + q(x)u=f(x),\quad x>a</math></nowiki><br />
<br />
===Complex numbers===<br />
<math>|\bar{z}| = |z|, |(\bar{z})^n| = |z|^n, \arg(z^n) = n \arg(z)</math><br />
<br />
<nowiki><math>|\bar{z}| = |z|,<br />
|(\bar{z})^n| = |z|^n,<br />
\arg(z^n) = n \arg(z)</math></nowiki><br />
<br />
===Limits===<br />
<math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math><br />
<br />
<nowiki><math>\lim_{z\rightarrow z_0} f(z)=f(z_0)</math></nowiki><br />
<br />
===Integral Equation===<br />
<math>\phi_n(\kappa)<br />
= \frac{1}{4\pi^2\kappa^2} \int_0^\infty \frac{\sin(\kappa R)}{\kappa R} \frac{\partial}{\partial R} \left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math><br />
<br />
<nowiki><math>\phi_n(\kappa) =<br />
\frac{1}{4\pi^2\kappa^2} \int_0^\infty<br />
\frac{\sin(\kappa R)}{\kappa R}<br />
\frac{\partial}{\partial R}<br />
\left[R^2\frac{\partial D_n(R)}{\partial R}\right]\,dR</math></nowiki><br />
<br />
===Example===<br />
<math>\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3},\quad \frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math><br />
<br />
<nowiki><math>\phi_n(\kappa) = <br />
0.033C_n^2\kappa^{-11/3},\quad<br />
\frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}</math></nowiki><br />
<br />
===Continuation and cases===<br />
<math>f(x) = \begin{cases}1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\ 1 - x^2 & \mbox{otherwise}\end{cases}</math><br />
<br />
<nowiki><math><br />
f(x) =<br />
\begin{cases}<br />
1 & -1 \le x < 0 \\<br />
\frac{1}{2} & x = 0 \\<br />
1 - x^2 & \mbox{otherwise}<br />
\end{cases}<br />
</math></nowiki><br />
<br />
===Prefixed subscript===<br />
<math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z) = \sum_{n=0}^\infty \frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}\frac{z^n}{n!}</math><br />
<br />
<nowiki> <math>{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z)<br />
= \sum_{n=0}^\infty<br />
\frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n}<br />
\frac{z^n}{n!}</math></nowiki><br />
<br />
===Fraction and small fraction===<br />
<math> \frac {a}{b}</math> &emsp; <math> \tfrac {a}{b} </math><br />
<nowiki><math> \frac {a}{b}\ \tfrac {a}{b} </math></nowiki><br />
<br />
</center><br />
<br />
===Unicode vs TeX comparison===<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 255pt; border-collapse: collapse;" width="340"> <br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; width: 48pt; height: 12.75pt; background-color: transparent;" width="64">unicode</td><br />
<td style="border: medium none #f0f0f0; width: 104pt; background-color: transparent;" width="139">TeX</td><br />
<td style="border: medium none #f0f0f0; width: 103pt; background-color: transparent;" width="137">See</td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">[\![</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>[\![</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\{</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\{</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\|</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\|</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\}</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\}</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\aleph</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\aleph</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">α</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\alpha</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\alpha</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨿</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\amalg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\amalg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\angle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\angle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ast</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ast</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≍</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">\</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\backslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\backslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">β</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\beta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\beta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcirc</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcirc</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigodot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigodot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigoplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigoplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigotimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigotimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigsqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigsqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangledown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangledown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigtriangleup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigtriangleup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⨄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\biguplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\biguplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigwedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigwedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bigvee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bigvee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bowtie</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bowtie</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">□</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Box</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Box</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\bullet</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\bullet</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">χ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\chi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\chi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\circ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\circ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\clubsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\clubsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\coprod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\coprod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\cup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\cup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">†</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\dashv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\dashv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">‡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddagger</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddagger</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ddots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ddots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Δ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Delta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Delta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamond</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamond</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\diamondsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\diamondsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">÷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\div</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\div</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\doteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\doteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Downarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Downarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℓ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ell</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ell</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\emptyset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\emptyset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϵ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\epsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\epsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">η</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\eta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\eta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\exists</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\exists</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\flat</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\flat</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\forall</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\forall</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\frown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\frown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Γ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Gamma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Gamma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gets</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gets</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\gg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\gg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℏ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hbar</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hbar</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\heartsuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\heartsuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\hookrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\hookrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Im</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Im</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ı</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\imath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\imath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\in</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\in</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∞</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\infty</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\infty</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\int</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\int</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ι</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\iota</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\iota</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">j</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\jmath</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\jmath</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">κ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\kappa</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\kappa</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Λ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Lambda</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Lambda</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\land</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\land</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\langle\!\langle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\langle\!\langle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">{</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">[</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\le</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\le</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">←</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Leftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Leftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌊</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≪</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ll</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ll</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lnot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lnot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟸</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟵</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longleftrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longleftrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longmapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longmapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟹</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟶</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\longrightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\longrightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\lor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\lor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↦</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mapsto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mapsto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mid</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mid</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\models</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\models</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">μ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\mu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\mu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nabla</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nabla</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\natural</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\natural</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ne</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ne</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nearrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nearrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">¬</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neg</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neg</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\neq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\neq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ni</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ni</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\approx</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\approx</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≭</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\asymp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\asymp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\cong</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\cong</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\equiv</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\equiv</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≱</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\geq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\geq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≰</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\leq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\leq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊄</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊈</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋡</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊅</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\not=</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\not=</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ν</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nu</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nu</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\nwarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\nwarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\odot</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\odot</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oint</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oint</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ω</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Omega</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Omega</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\ominus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\ominus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\oslash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\oslash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊗</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\otimes</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\otimes</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\parallel</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\parallel</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\partial</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\partial</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\perp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\perp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϕ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Phi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Phi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Π</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Pi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Pi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">±</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\pm</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\pm</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≺</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prec</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prec</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\preceq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\preceq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">′</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prime</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prime</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\prod</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\prod</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∝</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\propto</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\propto</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ψ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Psi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Psi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟩</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟫</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rangle\!\rangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rangle\!\rangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">}</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrace</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrace</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">]</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rbrack</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rbrack</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌉</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rceil</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rceil</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ℜ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Re</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Re</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌋</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rfloor</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rfloor</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ρ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Rightarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Rightarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoondown</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoondown</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightharpoonup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightharpoonup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇌</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\rightleftharpoons</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\rightleftharpoons</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\searrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\searrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∖</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\setminus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\setminus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♯</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sharp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sharp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Σ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Sigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Sigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∼</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sim</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sim</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\simeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\simeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⌣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\smile</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\smile</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">♠</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\spadesuit</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\spadesuit</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊓</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcap</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcap</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊔</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqcup</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqcup</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊏</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsubseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsubseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊐</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊒</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sqsupseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sqsupseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\star</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\star</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊂</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊆</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\subseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\subseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≻</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succ</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succ</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≽</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\succeq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\succeq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\sum</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\sum</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊃</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supset</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supset</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊇</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\supseteq</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\supseteq</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">√</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\surd</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\surd</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↙</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\swarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\swarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">τ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\tau</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\tau</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Θ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Theta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Theta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">×</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\times</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\times</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">→</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\to</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\to</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊤</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\top</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\top</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">△</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangle</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangle</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">◁</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleleft</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleleft</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">▷</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\triangleright</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\triangleright</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇑</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Uparrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Uparrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">↕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⇕</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Updownarrow</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Updownarrow</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊎</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\uplus</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\uplus</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Υ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Upsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Upsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ε</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varepsilon</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varepsilon</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">φ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varphi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varphi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϖ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varpi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varpi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϱ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varrho</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varrho</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ς</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\varsigma</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\varsigma</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ϑ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vartheta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vartheta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⊢</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdash</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdash</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⋮</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vdots</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vdots</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wedge</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wedge</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∨</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vee</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vee</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∣</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">∥</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Vert</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Vert</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">℘</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wp</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wp</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">≀</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\wr</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\wr</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">Ξ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\Xi</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\Xi</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ζ</td><br />
<td style="background-color: transparent; border: #f0f0f0;">\zeta</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>\zeta</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">⟧</td><br />
<td style="background-color: transparent; border: #f0f0f0;">]\!]</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>]\!]</math></td><br />
</tr><br />
<tr style="height: 12.75pt;"><br />
<td height="17" style="border: medium none #f0f0f0; height: 12.75pt; background-color: transparent;">ο</td><br />
<td style="background-color: transparent; border: #f0f0f0;">o</td><br />
<td style="background-color: transparent; border: #f0f0f0;"><math>o</math></td><br />
</tr><br />
</table></div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=admin/environment/php&diff=82333
admin/environment/php
2011-03-28T16:24:18Z
<p>Stronk7: added info for M2.1 and generalized info for M2.0</p>
<hr />
<div>Moodle has different PHP requirements for different versions:<br />
<br />
* Moodle 2.1 will require PHP 5.3.2 or later<br />
* Moodle 2.0 will require PHP 5.2.8 or later. However PHP 5.3.x is recommended<br />
* Moodle 1.6 to 1.9 requires PHP 4.3.0 or later<br />
* Moodle 1.0 to 1.5 requires PHP 4.1.0 or later<br />
<br />
==See also==<br />
<br />
* http://www.php.net/downloads.php for the latest downloads<br />
<br />
[[Category:Environment|PHP]]<br />
<br />
[[eu:admin/environment/php]]<br />
[[fr:admin/environment/php]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Process&diff=81724
Development talk:Process
2011-03-04T10:57:57Z
<p>Stronk7: /* About the "Commit messages" section in the page */</p>
<hr />
<div>I think 'User' should be described as both 'finding issues' and 'suggesting improvements' for Moodle, even if the detail of how things are implemented are left for the Product Owner. Just thinking that a good chunk of the things I add to the Tracker are suggestions for improvement rather than 'issues' as such and that we should promote this idea as a general rule - maybe :)<br />
<br />
:I agree with Mark. Bug tracker should be used for actual bugs. Discussion about future roadmaps, enhcnements and improvements is a separate matter, and in actual fact it is hard to engage in this. I don't have an answer at the moment. Maybe a place to discuss, and notification of when discussions have heated up (like specs are being prepared and a new roadmap developed for a component) ie owners manage the discussion, but there is a clear place to go to engage, some indication of timelines etc. --[[User:Derek Chirnside|Derek Chirnside]] 19:39, 25 November 2010 (UTC)<br />
<br />
Well, "issues" there was meant to cover "bugs" and "suggestions", as the tracker does both. I'll make it more explicit though. [[User:Martin Dougiamas|Martin Dougiamas]] 10:12, 30 November 2010 (UTC)<br />
<br />
OK - I could live with this. But I still prefer this clearer distinction as suggested by Mark:<br />
<br />
===User role===<br />
<br />
# Uses Moodle<br />
# Finds issues/bugs (report in tracker)<br />
# Suggests improvements (report in tracker)<br />
<br />
Question: is there a way in the tracker to keep issues in two lists: bugs and suggestions? Maybe even like Google: you can suggest anything, but at any given time there are a few suggestions up for vote? In Moodle, you can discuss anything, but someone is highlighting at any given time a few topics for focused discussions. On reflection the answer may be No - on this basis I am back to my original suggestion. <br />
<br />
A bug is a bug - it is not working as we know it should. A suggestion for an enhancement is partly an invitation to dialogue, vote. Voting for bugs is silly - all bugs need fixing, and priorities are best (IMO) determined centrally. So:<br />
<br />
#Uses Moodle<br />
#Finds and reports bugs (use tracker)<br />
#Suggests improvements (use tracker)<br />
#Takes part in dialogue around suggested improvements <br />
<br />
[[User:Derek Chirnside|Derek Chirnside]] 06:18, 4 December 2010 (UTC)<br />
<br />
:Derek, thanks for your comments. Regarding a way in the tracker to keep issues in two lists: bugs and suggestions, when you create an issue you have a choice of issue types - bug, new feature, task and improvement. Thus, a search for all new features and improvements should generate a list of suggestions. --[[User:Helen Foster|Helen Foster]] 14:31, 4 December 2010 (UTC)<br />
<br />
== Backlog naming == <br />
<br />
Regarding the latest change about naming backlog versions with "STABLEBACKLOG/DEVBACKLOG", I'd recommend to use instead something like: "1.9.x backlog/2.0.x backlog/2.1.x backlog" because:<br />
<br />
# It saves us to move things when a new major release happens (so it won't be necessary to move all the DEVBACKLOG => STABLEBACKLOG".<br />
# It supports '''multiple''' stable branches, like we have now (1.9.x, 2.0.x...)<br />
# It respects the format used by both the Affected Branches and Fixed Branches custom fields that are really useful for a lot of filters.<br />
<br />
Ciao, [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 23:33, 6 December 2010 (UTC) :-)<br />
<br />
:Addenda: Finally it has been decided to go to 2 backlogs only (stable/dev). Fair enough so developer (team) will look to the real branches were solution needs to be implemented. [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 10:23, 9 December 2010 (UTC)<br />
<br />
==This does not look like scrum to me at all==<br />
<br />
I think we need a certified scrum master. This proposal IMHO seems to break nearly all the good Scrum practises described in books.<br />
<br />
Ciao, [[User:Petr Škoda (škoďák)|Petr Škoda (škoďák)]] 10:03, 9 December 2010 (UTC)<br />
<br />
:Agree! some points (see point 3 especially, both in STABLE/DEV teams, break the thing. It's (scrum, by team) master responsibility to discuss with product owner, not team itself! Isolation is a MUST.<br />
<br />
: Ciao, [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 10:12, 9 December 2010 (UTC)<br />
<br />
----<br />
<br />
== If the issue is a bug in the current stable version requiring database changes, assign "Fix version" to DEVBACKLOG ==<br />
<br />
Hmm, maybe this should be governed up by bug severity too? You, sure, aren't going to say that every bug requiring DB update, however severe it is, should be left up to the next major release? --[[User:Oleg Sychev|Oleg Sychev]] 14:51, 9 December 2010 (UTC)<br />
<br />
<br />
I understand the idea of pulling from the items with the highest priority; however, how are we going to determine that priority. We have issue severity which has traditionally been seen as a priority indicator but we also have the number of votes. I am curious when paper cuts will be taken care of. These smaller issues can impact the user experience. I suspect in an ideal world, all the major issues will be dealt with but occasionally some simple fixes come along with patches in the tracker and it would be good to get those applied. Peace - Anthony<br />
<br />
: Well, in practice I expect people will choose items based on a cost/benefit analysis of fixing them - just like they always have in the past.--[[User:Tim Hunt|Tim Hunt]] 18:14, 16 December 2010 (UTC)<br />
<br />
<br />
== Suggested changes for "External Developers" ==<br />
I had a really good conversation with David (He posted a screenshot that maybe does a better job of explaining what is described below: http://picasaweb.google.com/david.mudrak/Moodle#5551427587739059122), and we discussed one possible suggested workflow external developers can use if they choose to use their own GIT repo. Here's how it would break down:<br />
<br />
=== Creating repo ===<br />
==== Branch off MOODLE_20_STABLE (ie: UCLA_TRUNK) ====<br />
$ git --bare fetch git://git.moodle.org/moodle.git MOODLE_20_STABLE:MOODLE_20_STABLE<br />
$ git checkout -b UCLA_TRUNK origin/MOODLE_20_STABLE<br />
<br />
==== commit customizations into branch ====<br />
$ ... (hack something, git add, git commit)<br />
$ git push<br />
<br />
=== Contributing back ===<br />
==== Create another branch off MOODLE_20_STABLE (ie: COOL_NEW_FEATURE) ====<br />
$ git --bare fetch git://git.moodle.org/moodle.git MOODLE_20_STABLE:MOODLE_20_STABLE<br />
$ git checkout -b COOL_NEW_FEATURE origin/MOODLE_20_STABLE<br />
<br />
==== git cherry-pick to selectively pick commits from UCLA_TRUNK to merge into COOL_NEW_FEATURE ====<br />
$ git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544<br />
<br />
==== publish branch COOL_NEW_FEATURE ====<br />
??<br />
<br />
==== create pull request in tracker ====<br />
http://tracker.moodle.org/browse/PULL-18<br />
<br />
If accepted, it becomes part of core moodle<br />
<br />
=== Updating to next version of Moodle ===<br />
$ git pull<br />
<br />
== Contrib Code - Development process ==<br />
<br />
I think this may be a good time to give some thought to coming up with the process we want to implement and enforce for sharing CONTRIB code. What assumptions do we want to make from the beginning? Should shared code be in a git repository somewhere? We have folks that share everything from zip files of plugins, some use Google code, others may use git. My experience has been that many are not initially proficient at using CVS/GIT, etc. although this seems to be improving. In any case, I would love to see a clear diagram about what someone does when they create code that they want to share. It has worked well to initiate conversations in the tracker as I can them work them through the Guidelines for CONTRIB Code (https://docs.moodle.org/en/Development:Guidelines_for_contributed_code) but I think we need to update that now for how we want to handle things in the future. Perhaps the improved M&P database will be the point of first contact. In any case, I would love to see if we could create a page similar to the Development:Process called something like Development:CONTRIB process. Peace - Anthony<br />
<br />
== External developers ==<br />
<br />
I have a question about the historical integrity of providing patches via links. For external developers, we say "Suggest code via links in comments in Jira". What happens if those links no longer work? Perhaps this is a trivial issue and will in practice hardly ever happen but I was thinking about going back to an older issue that it may be helpful to see an approach that was attempted but rejected. If the external developer removes the branch, then it would seem to me that perhaps their rejected patch would no longer be available to be reviewed later. Am I understanding this properly and if so, might we consider what the approach might be for getting patches in the tracker so that they can stay there? Peace - Anthony<br />
<br />
== About the "Commit messages" section in the page ==<br />
<br />
IMO [https://docs.moodle.org/en/Development:Process#Commit_messages that information] is:<br />
<br />
# Absolutely inaccurate. A lot of people has never used that commit messages structure at all.<br />
# Completely out of context: Unrelated with the purpose of the page (the development process, not its specifications or guidelines).<br />
<br />
So my +1 to take it out from there ASAP. Ciao :-) --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 00:23, 4 March 2011 (UTC)<br />
<br />
: Eloy, you are a senior developer. Please update the information and move it somewhere else. (Assuming other people agree.)<br />
<br />
: The information about commit messages needs to be seen by all Moodle developers (HQ and elsewhere) because they need to write good commit messages, module owners and integration reviewers, who need to review what developers have done. It is part of "How to do Moodle development", which is sort of what this page is about. (I copied this information from [[CVS for developers]] which is an even worse place for it to be these days. Perhaps we should create a new page [[Development:Commit messages]] (perhaps) and link to it from the git docs and the coding guidelines. (And probably a see-also link from here.)--[[User:Tim Hunt|Tim Hunt]] 08:17, 4 March 2011 (UTC)<br />
<br />
::+1 for a new page e.g. [[Development:Commit messages]] as [[Development:Process]] is a long page and shorter pages are much easier to read. --[[User:Helen Foster|Helen Foster]] 09:33, 4 March 2011 (UTC)<br />
::+1 for a new page as proposed above. Now we only need to agree about the format of the commit messages (or allow both alternatives that IMO will be the only way to go ahead in the agreement). --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 10:57, 4 March 2011 (UTC)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Process&diff=81717
Development talk:Process
2011-03-04T00:23:57Z
<p>Stronk7: /* External developers */</p>
<hr />
<div>I think 'User' should be described as both 'finding issues' and 'suggesting improvements' for Moodle, even if the detail of how things are implemented are left for the Product Owner. Just thinking that a good chunk of the things I add to the Tracker are suggestions for improvement rather than 'issues' as such and that we should promote this idea as a general rule - maybe :)<br />
<br />
:I agree with Mark. Bug tracker should be used for actual bugs. Discussion about future roadmaps, enhcnements and improvements is a separate matter, and in actual fact it is hard to engage in this. I don't have an answer at the moment. Maybe a place to discuss, and notification of when discussions have heated up (like specs are being prepared and a new roadmap developed for a component) ie owners manage the discussion, but there is a clear place to go to engage, some indication of timelines etc. --[[User:Derek Chirnside|Derek Chirnside]] 19:39, 25 November 2010 (UTC)<br />
<br />
Well, "issues" there was meant to cover "bugs" and "suggestions", as the tracker does both. I'll make it more explicit though. [[User:Martin Dougiamas|Martin Dougiamas]] 10:12, 30 November 2010 (UTC)<br />
<br />
OK - I could live with this. But I still prefer this clearer distinction as suggested by Mark:<br />
<br />
===User role===<br />
<br />
# Uses Moodle<br />
# Finds issues/bugs (report in tracker)<br />
# Suggests improvements (report in tracker)<br />
<br />
Question: is there a way in the tracker to keep issues in two lists: bugs and suggestions? Maybe even like Google: you can suggest anything, but at any given time there are a few suggestions up for vote? In Moodle, you can discuss anything, but someone is highlighting at any given time a few topics for focused discussions. On reflection the answer may be No - on this basis I am back to my original suggestion. <br />
<br />
A bug is a bug - it is not working as we know it should. A suggestion for an enhancement is partly an invitation to dialogue, vote. Voting for bugs is silly - all bugs need fixing, and priorities are best (IMO) determined centrally. So:<br />
<br />
#Uses Moodle<br />
#Finds and reports bugs (use tracker)<br />
#Suggests improvements (use tracker)<br />
#Takes part in dialogue around suggested improvements <br />
<br />
[[User:Derek Chirnside|Derek Chirnside]] 06:18, 4 December 2010 (UTC)<br />
<br />
:Derek, thanks for your comments. Regarding a way in the tracker to keep issues in two lists: bugs and suggestions, when you create an issue you have a choice of issue types - bug, new feature, task and improvement. Thus, a search for all new features and improvements should generate a list of suggestions. --[[User:Helen Foster|Helen Foster]] 14:31, 4 December 2010 (UTC)<br />
<br />
== Backlog naming == <br />
<br />
Regarding the latest change about naming backlog versions with "STABLEBACKLOG/DEVBACKLOG", I'd recommend to use instead something like: "1.9.x backlog/2.0.x backlog/2.1.x backlog" because:<br />
<br />
# It saves us to move things when a new major release happens (so it won't be necessary to move all the DEVBACKLOG => STABLEBACKLOG".<br />
# It supports '''multiple''' stable branches, like we have now (1.9.x, 2.0.x...)<br />
# It respects the format used by both the Affected Branches and Fixed Branches custom fields that are really useful for a lot of filters.<br />
<br />
Ciao, [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 23:33, 6 December 2010 (UTC) :-)<br />
<br />
:Addenda: Finally it has been decided to go to 2 backlogs only (stable/dev). Fair enough so developer (team) will look to the real branches were solution needs to be implemented. [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 10:23, 9 December 2010 (UTC)<br />
<br />
==This does not look like scrum to me at all==<br />
<br />
I think we need a certified scrum master. This proposal IMHO seems to break nearly all the good Scrum practises described in books.<br />
<br />
Ciao, [[User:Petr Škoda (škoďák)|Petr Škoda (škoďák)]] 10:03, 9 December 2010 (UTC)<br />
<br />
:Agree! some points (see point 3 especially, both in STABLE/DEV teams, break the thing. It's (scrum, by team) master responsibility to discuss with product owner, not team itself! Isolation is a MUST.<br />
<br />
: Ciao, [[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 10:12, 9 December 2010 (UTC)<br />
<br />
----<br />
<br />
== If the issue is a bug in the current stable version requiring database changes, assign "Fix version" to DEVBACKLOG ==<br />
<br />
Hmm, maybe this should be governed up by bug severity too? You, sure, aren't going to say that every bug requiring DB update, however severe it is, should be left up to the next major release? --[[User:Oleg Sychev|Oleg Sychev]] 14:51, 9 December 2010 (UTC)<br />
<br />
<br />
I understand the idea of pulling from the items with the highest priority; however, how are we going to determine that priority. We have issue severity which has traditionally been seen as a priority indicator but we also have the number of votes. I am curious when paper cuts will be taken care of. These smaller issues can impact the user experience. I suspect in an ideal world, all the major issues will be dealt with but occasionally some simple fixes come along with patches in the tracker and it would be good to get those applied. Peace - Anthony<br />
<br />
: Well, in practice I expect people will choose items based on a cost/benefit analysis of fixing them - just like they always have in the past.--[[User:Tim Hunt|Tim Hunt]] 18:14, 16 December 2010 (UTC)<br />
<br />
<br />
== Suggested changes for "External Developers" ==<br />
I had a really good conversation with David (He posted a screenshot that maybe does a better job of explaining what is described below: http://picasaweb.google.com/david.mudrak/Moodle#5551427587739059122), and we discussed one possible suggested workflow external developers can use if they choose to use their own GIT repo. Here's how it would break down:<br />
<br />
=== Creating repo ===<br />
==== Branch off MOODLE_20_STABLE (ie: UCLA_TRUNK) ====<br />
$ git --bare fetch git://git.moodle.org/moodle.git MOODLE_20_STABLE:MOODLE_20_STABLE<br />
$ git checkout -b UCLA_TRUNK origin/MOODLE_20_STABLE<br />
<br />
==== commit customizations into branch ====<br />
$ ... (hack something, git add, git commit)<br />
$ git push<br />
<br />
=== Contributing back ===<br />
==== Create another branch off MOODLE_20_STABLE (ie: COOL_NEW_FEATURE) ====<br />
$ git --bare fetch git://git.moodle.org/moodle.git MOODLE_20_STABLE:MOODLE_20_STABLE<br />
$ git checkout -b COOL_NEW_FEATURE origin/MOODLE_20_STABLE<br />
<br />
==== git cherry-pick to selectively pick commits from UCLA_TRUNK to merge into COOL_NEW_FEATURE ====<br />
$ git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544<br />
<br />
==== publish branch COOL_NEW_FEATURE ====<br />
??<br />
<br />
==== create pull request in tracker ====<br />
http://tracker.moodle.org/browse/PULL-18<br />
<br />
If accepted, it becomes part of core moodle<br />
<br />
=== Updating to next version of Moodle ===<br />
$ git pull<br />
<br />
== Contrib Code - Development process ==<br />
<br />
I think this may be a good time to give some thought to coming up with the process we want to implement and enforce for sharing CONTRIB code. What assumptions do we want to make from the beginning? Should shared code be in a git repository somewhere? We have folks that share everything from zip files of plugins, some use Google code, others may use git. My experience has been that many are not initially proficient at using CVS/GIT, etc. although this seems to be improving. In any case, I would love to see a clear diagram about what someone does when they create code that they want to share. It has worked well to initiate conversations in the tracker as I can them work them through the Guidelines for CONTRIB Code (https://docs.moodle.org/en/Development:Guidelines_for_contributed_code) but I think we need to update that now for how we want to handle things in the future. Perhaps the improved M&P database will be the point of first contact. In any case, I would love to see if we could create a page similar to the Development:Process called something like Development:CONTRIB process. Peace - Anthony<br />
<br />
== External developers ==<br />
<br />
I have a question about the historical integrity of providing patches via links. For external developers, we say "Suggest code via links in comments in Jira". What happens if those links no longer work? Perhaps this is a trivial issue and will in practice hardly ever happen but I was thinking about going back to an older issue that it may be helpful to see an approach that was attempted but rejected. If the external developer removes the branch, then it would seem to me that perhaps their rejected patch would no longer be available to be reviewed later. Am I understanding this properly and if so, might we consider what the approach might be for getting patches in the tracker so that they can stay there? Peace - Anthony<br />
<br />
== About the "Commit messages" section in the page ==<br />
<br />
IMO [https://docs.moodle.org/en/Development:Process#Commit_messages that information] is:<br />
<br />
# Absolutely inaccurate. A lot of people has never used that commit messages structure at all.<br />
# Completely out of context: Unrelated with the purpose of the page (the development process, not its specifications or guidelines).<br />
<br />
So my +1 to take it out from there ASAP. Ciao :-) --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 00:23, 4 March 2011 (UTC)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Release_process&diff=81682
Development talk:Release process
2011-03-01T23:26:39Z
<p>Stronk7: Last release block</p>
<hr />
<div>I think that it should be added something like "Update Latest Release block version on http://moodle.org/news/".<br />
<br />
Don't know if it would be better just before (or after) "Post about the release in the moodle.org news", or in the release day's process... --[[User:Séverin Terrier|Séverin Terrier]] 02:02, 2 December 2009 (UTC)<br />
<br />
:Thanks Séverin, I've just added it to [[Development:Release process]] and also updated the block (which was two versions behind!) --[[User:Helen Foster|Helen Foster]] 06:26, 2 December 2009 (UTC)<br />
<br />
I think you should also add a line after "Add the new version to the Moodle version history page", like "Include the new release notes in ''Moodle XX release notes'' page".--[[User:Séverin Terrier|Séverin Terrier]] 13:47, 11 February 2010 (UTC)<br />
<br />
::Thanks again Séverin, much appreciated :-) --[[User:Helen Foster|Helen Foster]] 16:36, 11 February 2010 (UTC)<br />
<br />
::Wow, so we are adding all the "minor-versions" notes to the "zero" release notes? I didn't know that at all! Doing that in the Spanish Docs right now --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 17:15, 11 February 2010 (UTC)<br />
::: Done, ciao! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 17:46, 11 February 2010 (UTC)<br />
<br />
:::I'm pleased to contribute. It's more easy to read, and usefull !--[[User:Séverin Terrier|Séverin Terrier]] 10:24, 12 February 2010 (UTC)<br />
<br />
Point 4 of "one week later" says: "Update the Latest Release block on Moodle.org news". Does that block exist under 2.0 @ moodle.org? Is it going to be reintroduced? I haven't been able to find it. Ciao :-) --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 23:26, 1 March 2011 (UTC)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Installing_Moodle&diff=81680
Installing Moodle
2011-03-01T23:03:48Z
<p>Stronk7: Re-added recently deleted =</p>
<hr />
<div>{{Template:Installing Moodle}}<br />
'''First, don't panic!''' [[Image:F1 35px.png]]<br />
<br />
This guide explains how to install Moodle for the first time. There are links to other pages that go into more detail and try to cover the majority of possible web server setups. <br />
<br />
Second, you may want to consider reviewing [[Finding and Selecting A Web Host]] to consider whether you really want to install Moodle yourself. If you decide to move forward with an installation, please read all the installation documentation carefully.<br />
<br />
Third, if you still have a problem for which you can't find the answer, please see the Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum] where there are many people who can help you.<br />
<br />
== Requirements ==<br />
<br />
Moodle is primarily developed in Linux using [[Apache]], [[MySQL]] and [[PHP]] (also sometimes known as the LAMP platform). It is also regularly tested with Windows XP/2000/2003 (WAMP), Solaris 10 (Sparc and x64), Mac OS X and Netware 6 operating systems. Support for PostgreSQL, Oracle and Microsoft SQL Server is also available.<br />
<br />
The requirements for Moodle are as follows:<br />
<br />
=== Hardware === <br />
* Disk space: 160MB free (min). You will require more free space to store your teaching materials.<br />
* Memory: 256MB (min), 1GB (recommended). The general rule of thumb is that Moodle can support 50 ''concurrent'' users for every 1GB of RAM, but this will vary depending on your specific hardware and software combination. <br />
** This includes hosting limits of PHP or MySQL on a hosting service.<br />
** The capacity can limit the number of users your Moodle site can handle. See [[User site capacities]]<br />
<br />
=== Software ===<br />
Moodle requires a web server environment and will run in [[Apache]] and [[IIS]] easily. Moodle should run in any server environment that supports [[PHP]]. <br />
<br />
Moodle is written in the PHP scripting language. Currently, Moodle v 1.9.x requires a minimum of PHP v4.3.0 to run. Moodle 2.0 needs PHP v 5.2.8. There have been some issues with deprecated tags in PHP v 5.3.0 which have a negative impact on a number of PHP Apps, Moodle not exempted, so please ensure your PHP version is later than v 5.3.2 if using a v5.3.x. There has also been reported some issues installing Moodle with [http://www.php-accelerator.co.uk PHP-Accelerator]. See the PHP Moodle version requirements here [[PHP settings by Moodle version]] for more information.<br />
<br />
Moodle will use MySQL, MSSQL, PostgreSQL or Oracle as a database, but no others. There is some real issues in the interoperability interface of different databases, which complicates the whole issue. For version information, you can go to the [http://download.moodle.org/ Download page] and that will describe version requirements for available packages. <br />
<br />
If you want to run Moodle on your own computer, please see [[Installing Apache, MySQL and PHP]] for step-by-step instructions for installation on most popular platforms.<br />
<br />
== Download and copy files into place ==<br />
<br />
There are two ways to get Moodle, either as a compressed package from http://download.moodle.org/ or via [[CVS for Administrators|CVS]]. <br />
<br />
After downloading and unpacking the archive, or checking out the files via CVS, you will be left with a directory called "moodle", containing a number of files and folders. <br />
<br />
For the standard package, you can either place the whole folder in your web server documents directory, in which case the site will be located at '''<nowiki>http://yourwebserver.com/moodle</nowiki>''', or you can copy all the contents straight into the main web server documents directory, in which case the site will be simply '''<nowiki>http://yourwebserver.com</nowiki>'''.<br />
<br />
:''Tip:'' If you are downloading Moodle to your local computer and then uploading it to your web site, it is usually better to upload the whole archive as one file, and then do the unpacking on the server. Even web hosting interfaces like cPanel allow you to uncompress archives in the "File Manager".<br />
<br />
If you're interested, [[Moodle site moodle directory]] gives a quick summary of the contents of the Moodle folder, to help get you oriented.<br />
<br />
:''NOTE:'' The "connectionless" nature of the Internet, HTML and server-side file generation allows you to simply copy over critical files without having to uninstall then reinstall. When you do this, go to the Administration > Notifications page to see if any change has been properly registered within Moodle. Time your upgrades to periods of minimal activity, safer that way.<br />
<br />
<br />
<br />
== Setting-up your web server ==<br />
You need to create a blank '''database''' for Moodle to use and finally create a '''directory''' on your hard disk for Moodle to save your materials and other files you upload into your courses before you can start the installation process.<br />
<br />
=== Create empty database ===<br />
<br />
You need to create an empty database (eg "''moodle''") in your database system along with a special user (for example "moodleuser") that has access to that database (and that database only). You could use the "root" user if you wanted to for a test server, but this is not recommended for a production system: if hackers manage to discover the password then your whole database system would be at risk, rather than just one database.<br />
<br />
For more help with this see [[Create Moodle site database]].<br />
<br />
If you are using a webhost, they will probably have a control panel web interface for you to create your database.<br />
<br />
The '''[http://www.cpanel.com/ cPanel]''' system is one of the most popular of these. <br />
To create a database using cPanel:<br />
<br />
# Click on the '''MySQL Databases''' icon.<br />
# Type '''moodle''' in the New Database field and click '''Create Database'''.<br />
# Type a ''username'' and ''password'' (not one you use elsewhere) in the respective fields and click '''Create User'''.<br>Note that the ''username'' and ''database'' names may be prefixed by your cPanel account name and an underscore, and truncated to 16 characters. When entering this information into the Moodle installer - use the full names.<br />
# Now use the '''Add Users to Databases''' button and give this new user account '''ALL''' rights to the new database.<br />
<br />
=== Create the data directory ===<br />
<br />
Moodle will also need some space on your server's hard disk to store uploaded files, such as course documents and user pictures. The Moodle installer tries hard to create the '''moodledata''' directory for you but if it fails then you will have to create a directory for this purpose manually.<br />
<br />
<table style=background-color:lightCyan border=1 cellpadding=5 cellspacing=0 ><tr><td><br />
'''Security warning''': For security purposes, it is '''CRITICAL''' that this directory is '''NOT''' accessible directly via the web. The easiest way to do this is to simply locate it OUTSIDE the web site root directory (it is the folder that the main part of your URL -that is, the part up to the first single / - points to; for example, in <nowiki>http://your.domain.com/moodle/admin/cron.php</nowiki>, it is <nowiki>http://your.domain.com/</nowiki>).<br />
<br />
'''If you don't protect the data directory from direct web access, anybody will be able to impersonate any user of your Moodle site (including the admin user!!!), and all of your course materials will be available to the web at large.'''<br />
</table><br />
<br />
See [[Creating Moodle site data directory]] for more information about security in creating a data directory in CPanel in webhosts.<br />
<br />
=== Troubleshooting ===<br />
<br />
If you run into problems when installing Moodle you might have to tweak some of the settings for your Apache server or your PHP installation.<br />
<br />
* [[Installing Moodle/httpd.conf setup]]<br />
* [[Installing Moodle/Creating custom php.ini files]] for details.<br />
* '''Alternative to ''php.ini'' and ''httpd.conf'' files''': If you do not have access to your php.ini or httpd.conf files on you web host, see [[Create .htaccess file]].<br />
* Warning: as noted at http://moodle.org/mod/forum/discuss.php?d=124441&parent=550026 some Moodle installers such as Ubuntu populate an Apache conf.d file with php directives. Before trying to change any php directives make sure that no php directives are set in any apache conf file, including files in /etc/apache2/conf.d or similar directory.<br />
<br />
== Start Moodle install ==<br />
There are two basic ways to install Moodle: Most Moodlers are used to the installer script but with Moodle 2.0 you may install it from the command line.<br />
<br />
=== Install with installer script ===<br />
<br />
To run the installer script (install.php), just try to access your Moodle main URL using a web browser, or access '''<nowiki>http://yourserver/install.php</nowiki>''' directly.<br />
<br />
(The Installer will try to set a session cookie. If you get a popup warning in your browser make sure you accept that cookie!)<br />
<br />
Moodle will detect that configuration is necessary and will lead you through some screens to help you create a new configuration file called '''config.php'''. At the end of the process Moodle will try and write the file into the right location, otherwise you can press a button to download it from the installer and then upload '''config.php''' into the main Moodle directory on the server.<br />
<br />
Along the way the installer will test your server environment and give you suggestions about how to fix any problems. For most common issues these suggestions should be sufficient, but if you get stuck, check in the Installation Forum for more help.<br />
<br />
==== Go to the admin page to continue configuration ====<br />
<br />
Once the basic config.php has been correctly created in the previous step, trying to access the front page of your site will take you to the "admin" page for the rest of the configuration.<br />
<br />
The first time you access this admin page, you will be presented with a GPL "shrink wrap" agreement with which you must agree before you can continue with the setup.<br />
<br />
Now Moodle will start setting up your database and creating tables to store data. First, the main database tables are created. You should see a number of SQL statements followed by status messages. You should see <font color="green">SUCCESS</font> next to each one until you see "<font color="green">Main databases set up successfully</font>."<br />
<br />
:''Tip:'' If you don't see these, then there must have been some problem with the database or the configuration settings you defined in config.php. Please see [[Install Moodle with installer script]] for more details and issues. <br />
<br />
Scroll down the very bottom of the page and press the "Continue" link.<br />
<br />
You should now see a form where you can define more configuration variables for your installation, such as the default language, SMTP hosts and so on. Don't worry too much about getting everything right just now - you can always come back and edit these later on using the admin interface. The defaults are designed to be useful and secure for most sites. Scroll down to the bottom and click "Save changes".<br />
<br />
Next you will see more pages that print lots of status messages as they set up all the tables required by the various Moodle module. As before, they should all be <font color="green">green</font>.<br />
<br />
Scroll down the very bottom of the page and press the "Continue" link.<br />
<br />
The next page is a form where you can define parameters for your Moodle site and the front page, such as the name, format, description and so on. Fill this out (you can always come back and change these later) and then press "Save changes".<br />
<br />
Finally, you will then be asked to create a top-level administration user for future access to the admin pages. Fill out the details with your own name, email etc and then click "Save changes". Not all the fields are required, but if you miss any important fields you'll be re-prompted for them. You can change this information later via the [[User profile]].<br />
<br />
'''Make sure you remember the username and password you chose for the administration user account, as they will be necessary to access the administration page in future.'''<br />
<br />
:''TIP:'' If for any reason your install is interrupted, or there is a system error of some kind that prevents you from logging in using the admin account, you can usually log in using the default username of "'''admin'''", with password "'''admin'''".)<br />
<br />
Once successful, you will be sent to the home page of your new site! Please note the [[Site administration block]] on the left with links. These items are only visible to you because you are logged in as the admin user. All your further administration of Moodle can now be done using this block.<br />
<br />
=== Installing Moodle using command line ===<br />
{{Moodle 2.0}}<br />
<br />
[[Installing Moodle using command line]] is recommended only for experienced server administrators. Please note you have to execute the installation script as the same user used for apache. Command line installation is not compatible with Windows platforms.<br />
<br />
$cd /var/www/html/moodle/admin/cli<br />
<br />
More information about the options can be found using <br />
$sudo -u wwwrun /usr/bin/php install.php --help<br />
<br />
==Last tasks==<br />
<br />
=== Set up cron ===<br />
<br />
Moodle's background tasks (e.g. sending out forum emails and performing course backups) are performed by a script which you can set to execute at specific times of the day. This is known as a cron script. Please refer to the [[Cron|Cron instructions]].<br />
<br />
=== Set up backups ===<br />
<br />
Please refer to the [[Backup settings| backup instructions]].<br />
<br />
=== Send a test email ===<br />
<br />
Create a [[Manual_accounts|test user]] with a valid email address and [[message|send them a message]]. Do they receive an email copy of the message? If not then your email server and/or Moodle email settings may be misconfigured (see [[Email_processing|Email Processing]] for details.<br />
<br />
===Create a new course===<br />
<br />
Congratulations on setting up your Moodle site! You can now [[Adding/editing a course|create a new course]] and have a play ;-)<br />
<br />
== See also ==<br />
* [[Complete install packages]]<br />
* Using Moodle [http://moodle.org/mod/forum/view.php?id=28 Installation problems forum]<br />
* [[Installing Apache, MySQL and PHP]]<br />
* [[Upgrading Moodle]]<br />
* [[Beginning Administration FAQ]]<br />
* Using Moodle [http://moodle.org/mod/forum/discuss.php?d=42688 Selecting a web host for Moodle] forum discussion<br />
* [[masquerading|Masquerading]] - Running Moodle behind a masquerading/NAT firewall<br />
* [http://ic.eflclasses.org/tutorials/settingupmoodleonhostingwitholdcpanel.swf Tutorial on choosing a host and setting up moodle via the old cpanel]<br />
* [[Installation FAQ]]<br />
* [[Finding and Selecting A Web Host]]<br />
* [[experimental:Getting Help Installing and Managing Moodle]]<br />
* [[Step-by-step Guide for Installing Moodle on Mac OS X 10.4 Client]]<br />
* [[Installing Moodle on Windows Vista]]<br />
* [[Step-by-step Installation Guide for Ubuntu]]<br />
* [[RedHat Linux installation]]<br />
* [[CentOS Linux installation]]<br />
<br />
[[es:Instalaci%C3%B3n_de_moodle]]<br />
[[de:Installation von Moodle]]<br />
[[fr:Installation de Moodle]]<br />
[[ja:Moodleのインストール]]<br />
[[ru:Установка Moodle]]<br />
[[zh:安装Moodle]]<br />
{{Review}}</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Release_notes_template&diff=81450
Development:Release notes template
2011-02-21T16:42:05Z
<p>Stronk7: s/t/T</p>
<hr />
<div>Copy and paste this wiki code into the new Release Notes page and replace all the missing bits.<br />
<code text><br />
Release date: Not yet released<br />
<br />
Here is [http://tracker.moodle.org/secure/ReleaseNote.jspa?projectId=10011&version=XXXXX the full list of fixed issues in X.X.X].<br />
<br />
===Highlights===<br />
<br />
* ...<br />
<br />
===Functional changes===<br />
<br />
* ...<br />
<br />
===Security issues===<br />
<br />
To be released later<br />
<br />
<noinclude>==See also==<br />
*[[Moodle X.X.X-1 release notes]]<br />
<br />
[[Category:Release notes]]<br />
[[Category:Moodle X.X]]<br />
<br />
[[de:Moodle X.X.X Versionsinformationen]]<br />
[[es:Notas de Moodle X.X.X]]<br />
[[fr:Notes de mise à jour de Moodle X.X.X]]<br />
</noinclude><br />
</code><br />
<br />
[[es:Plantilla para las notas de versiones|Plantilla en Español]]<br />
<br />
[[Category:Processes|Release process]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Moodle_3.0&diff=81407
Development:Moodle 3.0
2011-02-19T01:37:54Z
<p>Stronk7: /* Please Sanitize the PHP code */</p>
<hr />
<div>Warning! This page is highly speculative.<br />
<br />
It is basically a dumping ground for random ideas from anyone who wants to write something here. It is not in any way an official Moodle roadmap or policy. Some of the good ideas here may be adopted, but most of the ideas are pretty crazy, and will never work. Basically, it is a place to brainstorm. Please add your own crazy ideas! They don't need to be consistent yet, just make sure your ideas are here to be boiled down later on.<br />
<br />
Think Big!<br />
<br />
===One type of plugin===<br />
<br />
All plugins/modules could be subclassed from one plugin class, making installation easier and simplifying the API a lot.<br />
<br />
===Look at new framework===<br />
<br />
Possibly base Moodle 3.0 on new existing frameworks? Ruby on Rails? Drupal?<br />
<br />
==== Drupal ====<br />
There's an interesting discussion in the Language Teaching Course:<br />
[http://moodle.org/mod/forum/discuss.php?d=83963 How can Moodle be more of a social networking site?] with some links to the [http://groups.drupal.org/drupal-education Drupal in Education User Group]. --[[User:Frank Ralf|Frank Ralf]] 14:27, 18 January 2009 (CST)<br />
<br />
(I started a section about [[User_talk:Frank_Ralf#What_Moodle_could_learn_from_Drupal|What Moodle could learn from Drupal]] on my User talk page. --[[User:Frank Ralf|Frank Ralf]] 06:35, 21 January 2009 (CST))<br />
<br />
There are some activities in the Drupal community regarding better interoperability and integration of Moodle and Drupal, see [http://moodle.org/mod/forum/discuss.php?d=121859 Drupal Quiz module - data exchange with other LMSes] and [http://moodle.org/mod/forum/discuss.php?d=119857 Moodle integration with Drupal]. --[[User:Frank Ralf|Frank Ralf]] 08:10, 10 June 2009 (UTC)<br />
<br />
==== Zend Framework ====<br />
How about [http://framework.zend.com/ZendFramework ZendFramework]? It's open source, of course, runs on PHP, already has a pretty cool API with a well stocked service library, and the coders are working closely with Google, Adobe and Microsoft, among others, to produce some really high quality code. One feature I particularly like is that the main bulk of the PHP code is outside the public HTML directory. Since version 1.7 It also offers pretty good support for Flash Remoting (AMF0 and AMF3) making it especially easy to create integrated RIA frameworks. [http://framework.zend.com/about/components Check here] to see what you get "out of the box". It looks like they've already done most of the hard work for you.<br />
<br />
=== Moodlets===<br />
<br />
Individual-independent-activities backup/restore + metadata - Eloy<br />
<br />
=== Support for alternate interfaces, mobile interfaces ===<br />
<br />
Optimized for tablet computing: iPad, others<br />
Completely flash-based interface? Designed for offline clients?<br />
<br />
=== Integrated category/taxonomy system ===<br />
<br />
Putting together the "course categories", "tags" into a generic taxonomy system.<br />
<br />
=== Save the 1970-2038 limitation ===<br />
<br />
Those UNIX timestamps are [http://moodle.org/mod/forum/discuss.php?d=101984 pretty limited].<br />
<br />
=== Translation framework ===<br />
Drupal uses [http://www.gnu.org/software/gettext/gettext.html GNU gettext].po files for providing translations which is a very robust and well understood format.<br />
<br />
Or XLIFF format (use in Zend Framework, Symfony, Intl extension) with [http://icu-project.org/download/rbmanager.html Resource bundle manager]<br />
<br />
=== Use PHP 5.3 Native Power ===<br />
Like : PDO, SPL, Namespace, Intl, Phar...<br />
(Zend Framework 2 use it)<br />
<br />
=== Make a replica Moodle ===<br />
1 Moodle library, 100 Moodle platforms, just adding plugins and themes.<br />
<br />
=== Please Sanitize the PHP code ===<br />
Don't use : ini_set<br />
<br />
Don't use : error_reporting<br />
<br />
Don't use : @<br />
<br />
Don't use : eval<br />
<br />
Don't use alias : exemple : die (it's exit)<br />
<br />
Don't use depreciates functions : exemple : split (it's explode or preg_split)<br />
<br />
<br />
Use the right functions : exemple : it's not ini_set('include_path') it's set_include_path<br />
<br />
Use Docbook everywhere<br />
<br />
Moodle is now PHP 5 : clear "var" in class, methods are public/private/protected function (not just function)<br />
<br />
:Many thanks for your invaluable and expert opinion, we'll be working hard on all those, sincerely! --[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 01:37, 19 February 2011 (UTC)<br />
<br />
=== Built for Teacher-to-teacher Content Sharing ===<br />
<br />
Drag-and-drop courses and course items from Moodle Hubs<br />
<br />
=== Learn from LAMS and Dokeos ===<br />
<br />
Integrated authoring system<br />
Drag-and-drop sequential scenario-building<br />
<br />
=== Invent something crazily new ===<br />
3-line ideas are welcome here:<br />
* participation reward systems<br />
* Add trashcan and /or undo function<br />
* Make editing of modules WYSIWYG, no more icons that change layout<br />
* Collaborative spreadsheet editing functionality - like Google Docs.<br />
<br />
=== More Agile Development ===<br />
There are many elements in agile development that could apply to Moodle and benefit the development process tremendously. With proper application of these elements, the Moodle's core code can be more solid and robust. Any programmer can make changes to the source with confidence and not be afraid of breaking any other features.<br />
<br />
==== Test Driven Development ====<br />
Require unit tests and acceptance tests be written for every change made to the core code. No code should be committed to the core without any test written. A code reviewer should run the tests and expect them to be failed before applying the code changes, and expect they all passed after applying the fix or code changes. S/he should also run the full test suite to make sure the changes did not break any existing features and functionalities.<br />
<br />
==== Code Review ====<br />
Implement a code review process like the [http://codereview.chromium.org Google Chromium project]. Developers can only commit to the trunk with one or more reviewers' approval.<br />
<br />
''I wonder if the person who added these ideas has any idea how Moodle development actually works. I would guess not. The process is already very agile. All contributions are code-reviewed. There are not enough unit tests yet, but writing unit tests for legacy code is the hardest sort of tests to write (see the book xUnit test patterns) so frankly, it is not worth the effort, except in new code. I can get away with saying that because I have written 2500+ test cases for the latest bit of development I did.''--[[User:Tim Hunt|Tim Hunt]] 15:23, 6 February 2011 (UTC)<br />
<br />
''Hi Tim, please don't take me wrong. I think the development team at Moodle is already very agile. It is actually one of the few agile projects that I have seen in the open source communities. The effort that you and many diligent individuals have made to coordinate and integrate contributions from all over the world is outstanding. I just made these comments based on the software development environment I came from, where no code change is allowed to commit without any test written and reviewer signs off. Our VCS is actually configured to reject any commit that do not have these two elements present. You are correct that I do not fully know the Moodle development process yet, but the fact that I see codes (particular contributed codes) being checked in without any tests, I just thought it would help bolster Moodle's core code by enforcing this rule in future commits. And implementing something like [http://codereview.chromium.org Google Chromium code review] interface allows more eyes on the check-in codes, and hopefully alleviates some of the loads from you and the rest of the core team, who have been doing a wonderful work on peer-reviewing all these time. Again, please don't take this as a criticism but a brian-storming idea if you will. Peace.'' --Carson</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Release_process&diff=81292
Development:Release process
2011-02-14T09:56:44Z
<p>Stronk7: /* For a stable release on an existing branch XX with point value Y */</p>
<hr />
<div>This page describes the standard procedures for making Moodle releases.<br />
<br />
===For a stable release on an existing branch XX with point value Y===<br />
<br />
One week before:<br />
# Notify Moodle developers and Moodle Partners about the upcoming release<br />
# Freeze stable development and post in the [http://moodle.org/mod/forum/view.php?id=55 General developer forum] to inform everyone of the freeze<br />
# Review and complete the [[:Category:Release notes|release notes]] of the upcoming version.<br />
# [[Development:Weekly Code Review|Test / QA]] etc<br />
<br />
Release day: (exactly before the next integration cycle begins on Monday)<br />
# Make sure all the Unit tests pass!<br />
# Edit version.php, update name and version to new point release and commit in the integration repository<br />
# Tag the integration repository with MOODLE_XXY (old style) '''and''' vX.X.Y (new style)<br />
# push change to main git repo, github and Gitorious<br />
# sync CVS mirror (copy the version.php file and update githash.php to point to the release commit)<br />
# '''cvs tag -FR MOODLE_XXY''' to tag everything in the release<br />
# '''cvs tag -FR vX.X.Y''' to tag everything in the release<br />
# '''cvs tag -FR MOODLE_XX_WEEKLY''' to make the weekly version match the release<br />
# '''cvs -q update -dP''' all code on download server<br />
# Run moodle-makenightlystableXX<br />
# Go to download/stableXX <br />
# Copy current daily as release package:<br />
## '''cp moodle-latest-XX.zip moodle-X.X.Y.zip'''<br />
## '''cp moodle-latest-XX.tgz moodle-X.X.Y.tgz'''<br />
# Edit download index.php page with new release info and links<br />
# Run moodle-makewindowspackages so all the windows packages will be rebuilt<br />
# Edit download windows/index.php page with new release info (always keeping the "+")<br />
# Visit releases page on tracker and make the release, bumping all remaining open bugs to the next point release. This must be done both for the [http://tracker.moodle.org/secure/project/ViewProject.jspa?pid=10011 Moodle Project] and the [http://tracker.moodle.org/secure/project/ViewProject.jspa?pid=10033 Non-core contributed modules project].<br />
# Add the release date to the [[:Category:Release notes|release notes]]<br />
# Update the [[Latest release notes]] page<br />
# Add the new version to the [[Moodle version history]] page<br />
# Include the new versions in [[Moodle 1.8 release notes]], [[Moodle 1.9 release notes]] and [[Moodle 2.0 release notes]]<br />
# Notify all registered sys admins<br />
# Create a new ('''blocker serious security issue!''') META bug in the Tracker "META: Moodle XX.Y+1 and friends security bugs" to associate new/pending security bugs that will be fixed in the next release as subtasks. An example is MDL-20840 (for Moodle 1.9.7).<br />
# Create a new ('''blocker serious security issue!''') task in the Tracker "Prepare security advisories for XX.Y+1 and friends" to define/edit/polish the security advisories in the next release. Link it with the previous one as "will be resolved by". An example is MDL-20722 (for Moodle 1.9.7).<br />
# final step - tag the release in git repositories (integration, main and mirrors) - to be done by Martin Dougiamas<br />
<br />
One week later:<br />
# Update the version.php in git to be X.X.Y+ during the next weekly PULL process<br />
# Add all security advisories to [http://moodle.org/security Security news]<br />
# Add all security issues to the [[:Category:Release notes|release notes]] with links to security advisories<br />
# Update the Latest Release block on [http://moodle.org/news/ Moodle.org news]<br />
# Post about the release in the [http://moodle.org/news/ moodle.org news]<br />
# Create a new release notes page for the next version XX.Y+1 (here you can find [[Development:Release notes template|one template for that]])<br />
<br />
==See also==<br />
<br />
* [[Development:Stable branch support]]<br />
* [[Development:Major release process]]<br />
* MDLSITE-699: How to repackage one weekly at any moment (a.k.a. "emergency weekly").<br />
<br />
[[Category:Processes|Release process]]<br />
[[Category:Release notes|Release process]]</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Moodle_3.0&diff=81106
Development:Moodle 3.0
2011-02-07T11:39:02Z
<p>Stronk7: thinking big, lol</p>
<hr />
<div>Warning! This page is highly speculative.<br />
<br />
It is basically a dumping ground for random ideas from anyone who wants to write something here. It is not in any way an official Moodle roadmap or policy. Some of the good ideas here may be adopted, but most of the ideas are pretty crazy, and will never work. Basically, it is a place to brainstorm. Please add your own crazy ideas! They don't need to be consistent yet, just make sure your ideas are here to be boiled down later on.<br />
<br />
Think Big!<br />
<br />
===One type of plugin===<br />
<br />
All plugins/modules could be subclassed from one plugin class, making installation easier and simplifying the API a lot.<br />
<br />
===Look at new framework===<br />
<br />
Possibly base Moodle 3.0 on new existing frameworks? Ruby on Rails? Drupal?<br />
<br />
==== Drupal ====<br />
There's an interesting discussion in the Language Teaching Course:<br />
[http://moodle.org/mod/forum/discuss.php?d=83963 How can Moodle be more of a social networking site?] with some links to the [http://groups.drupal.org/drupal-education Drupal in Education User Group]. --[[User:Frank Ralf|Frank Ralf]] 14:27, 18 January 2009 (CST)<br />
<br />
(I started a section about [[User_talk:Frank_Ralf#What_Moodle_could_learn_from_Drupal|What Moodle could learn from Drupal]] on my User talk page. --[[User:Frank Ralf|Frank Ralf]] 06:35, 21 January 2009 (CST))<br />
<br />
There are some activities in the Drupal community regarding better interoperability and integration of Moodle and Drupal, see [http://moodle.org/mod/forum/discuss.php?d=121859 Drupal Quiz module - data exchange with other LMSes] and [http://moodle.org/mod/forum/discuss.php?d=119857 Moodle integration with Drupal]. --[[User:Frank Ralf|Frank Ralf]] 08:10, 10 June 2009 (UTC)<br />
<br />
==== Zend Framework ====<br />
How about [http://framework.zend.com/ZendFramework ZendFramework]? It's open source, of course, runs on PHP, already has a pretty cool API with a well stocked service library, and the coders are working closely with Google, Adobe and Microsoft, among others, to produce some really high quality code. One feature I particularly like is that the main bulk of the PHP code is outside the public HTML directory. Since version 1.7 It also offers pretty good support for Flash Remoting (AMF0 and AMF3) making it especially easy to create integrated RIA frameworks. [http://framework.zend.com/about/components Check here] to see what you get "out of the box". It looks like they've already done most of the hard work for you.<br />
<br />
=== Moodlets===<br />
<br />
Individual-independent-activities backup/restore + metadata - Eloy<br />
<br />
=== Support for alternate interfaces, mobile interfaces ===<br />
<br />
Optimized for tablet computing: iPad, others<br />
Completely flash-based interface? Designed for offline clients?<br />
<br />
=== Integrated category/taxonomy system ===<br />
<br />
Putting together the "course categories", "tags" into a generic taxonomy system.<br />
<br />
=== Save the 1970-2038 limitation ===<br />
<br />
Those UNIX timestamps are [http://moodle.org/mod/forum/discuss.php?d=101984 pretty limited].<br />
<br />
=== Translation framework ===<br />
Drupal uses [http://www.gnu.org/software/gettext/gettext.html GNU gettext].po files for providing translations which is a very robust and well understood format.<br />
<br />
=== Use PHP 5.3 Native Power ===<br />
Like : PDO, SPL, Namespace, Intl, Phar...<br />
(Zend Framework 2 use it)<br />
<br />
=== Make a replica Moodle ===<br />
1 Moodle library, 100 Moodle platforms, just adding plugins and themes.<br />
<br />
=== Built for Teacher-to-teacher Content Sharing ===<br />
<br />
Drag-and-drop courses and course items from Moodle Hubs<br />
<br />
=== Learn from LAMS and Dokeos ===<br />
<br />
Integrated authoring system<br />
Drag-and-drop sequential scenario-building<br />
<br />
=== Invent something crazily new ===<br />
3-line ideas are welcome here:<br />
* participation reward systems<br />
* Add trashcan and /or undo function<br />
* Make editing of modules WYSIWYG, no more icons that change layout<br />
* Collaborative spreadsheet editing functionality - like Google Docs.<br />
<br />
=== More Agile Development ===<br />
There are many elements in agile development that could apply to Moodle and benefit the development process tremendously. With proper application of these elements, the Moodle's core code can be more solid and robust. Any programmer can make changes to the source with confidence and not be afraid of breaking any other features.<br />
<br />
==== Test Driven Development ====<br />
Require unit tests and acceptance tests be written for every change made to the core code. No code should be committed to the core without any test written. A code reviewer should run the tests and expect them to be failed before applying the code changes, and expect they all passed after applying the fix or code changes. S/he should also run the full test suite to make sure the changes did not break any existing features and functionalities.<br />
<br />
==== Code Review ====<br />
Implement a code review process like the [http://codereview.chromium.org Google Chromium project]. Developers can only commit to the trunk with one or more reviewers' approval.<br />
<br />
''I wonder if the person who added these ideas has any idea how Moodle development actually works. I would guess not. The process is already very agile. All contributions are code-reviewed. There are not enough unit tests yet, but writing unit tests for legacy code is the hardest sort of tests to write (see the book xUnit test patterns) so frankly, it is not worth the effort, except in new code. I can get away with saying that because I have written 2500+ test cases for the latest bit of development I did.''--[[User:Tim Hunt|Tim Hunt]] 15:23, 6 February 2011 (UTC)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development_talk:Modules_and_plugins_replacement_proposal&diff=81018
Development talk:Modules and plugins replacement proposal
2011-02-02T20:29:37Z
<p>Stronk7: /* typo? */</p>
<hr />
<div>Some minor suggestions from Tim (so much for the request not to comment yet):<br />
<br />
* This may be a version 2.0 feature, but simple links from the database entries to the place on AMOS where people need to go to translate this plugin, and back again.<br />
* In terms of which version of core Moodle the plugins works with, there are big advantages if this information can remain in version.php, where it is readable by the Moodle install code. The MnP database could automatically read the data out of there to display on the web, like AMOS gets strings out of version control.<br />
<br />
In the database schema:<br />
* Rather than separate local_contrib_plugin_contributor.creator/active columns, would it be better to have a single contributortype column? Easier to extend in future.<br />
* Should userid be in local_contrib_review or local_contrib_review_outcome?<br />
* If there a good reason for using 'softwareversion' in names? moodleversion would make it clearer. Of course, that is less generic.<br />
* should local_contrib_review_outcomes have a machine-readable column that holds a status like pass/fail, as well as the text in review?<br />
* Do you really need hierarchical categories. They are a pain in SQL, and they add UI complexity. I think one-level categories may be fine, particularly if you have tags as well.<br />
<br />
In terms of display, it would be nice if you could use group icons from using Moodle (like core-developer, Partner, PHM) when displaying users. It would be useful if people could see that a review was by a core developer.<br />
<br />
I had not realised that the file API did not support local plugins. See https://github.com/moodle/moodle/blob/master/pluginfile.php#L738<br />
<br />
Would a capability like "new entries from this user approved automatically" and "new versions from this user approved automatically" be worthwhile? I believe the current system overloads the approve capability for this, which causes pain.<br />
<br />
--[[User:Tim Hunt|Tim Hunt]] 09:17, 12 January 2011 (UTC)<br />
<br />
Hi Tim,<br />
Thanks for the early feedback, all good suggestions/observations.<br />
In response to the points you have raised:<br />
* AMOS links make VERY good sense and I'm sure I'll be able to easily fit them in.<br />
* Good suggestion, I still have to talk to Martin about how things will be stored, however where practical if possible it would be great if we could utilise version.php<br />
* Interesting idea, I had separated the two as the creator may no longer be active (passed the responsibility onto others). Perhaps if active is made contributortype that would allow us to extend in the future (primary or owner being an obvious extension).<br />
* userid I think should be local_contrib_review, there will be a record created there for each individual review which will consist of the general review stored within that record, and then several criteria reviews stored in local_contrib_review_outcome. Does that make sense? Remembering of course this is all very fresh and it may be me misunderstanding something here.<br />
* Yes, softwareversion isn't the greatest I did refrain from calling it moodleversion to keep the project more easily diversable, however I have yet to talk to Martin about that prospect... not too sure what he will want but I'll leave that one up to him.<br />
* In regards to local_contrib_review_outcome I was intending to you the core rating system for that, however it would require core changes presently. If the rating system isn't used then it will certainly need that column. Also I will have to at some point consider performance, I haven't looked at the ratings internal but if it isn't joinable in a friendly way then it may be worth duplicating that information in the local_contrib_review_outcome table for quicker lookups.<br />
* Group icons === awesome idea which I will be sure to work in.<br />
* Haha quite right it does support files, I've updated the doc now. I had given it a quick glance and misread the above else thinking anything with an underscore entered there..... just another reason I should read more carefully. Thanks for pointing that out.<br />
* Yes to both the capability suggestions, there had been talk about automating that some how and capabilities for it would be perfect.<br />
<br />
Again thank you, I'll amend the rest of the doc shortly.<br />
<br />
Cheers<br />
<br />
--[[User:Sam Hemelryk|Sam Hemelryk]] 09:48, 12 January 2011 (UTC)<br />
<br />
== Initial comments from David ==<br />
<br />
* overall - sounds good! :-)<br />
* re links to AMOS - easy to implement now as AMOS already supports permalinks to its filter so it is easy to construct URL that leads the user directly to a page where a given component on a given branch is translated<br />
* what I miss in the document is a mention of some webservices support. We will either need webservice layer or maybe better just a script that generates plugins info into a big XML file. Such file will describe all the plugins and the location of their sources. This file will be then fetch regularly by Moodle sites' plugin_manager that will allow remote update/installation via the web. I am willing to work on this part once we branch MOODLE_20_STABLE, though there is no spec yet, sorry. The goal is to allow simple installations of extensions from the Moodle admin interface - similarly to what Wordpress does<br />
* that XML file would be used by AMOS, too, so that it knows what plugins and their branches it should track<br />
<br />
--[[User:David Mudrak|David Mudrak]] 10:57, 12 January 2011 (UTC)<br />
<br />
Hi David<br />
<br />
Thanks for looking it over and having a think about it. I've been working on the proposal again today and building it up more and more.<br />
<br />
In reply to your points:<br />
<br />
* Awesome that AMOS has a predictable link structure, it certainly will be cool to integrate the two system.<br />
* There is now information about RSS feeds and web services that the new system will be able to process. The idea of having everything available from the admin interface of your Moodle installation is great. I'm not too sure presently what Martins plans for undertaking such work are, however he did ask for it to be provisioned where/if possible within this new system.<br />
* I would like to talk to you at some point after Martin is back to find out how we could best integrate this system with AMOS. It'd be great to see where we could take it and I'm sure you'd have the best idea about what is possible there. I'll get in touch with you after I've talked to Martin and organise a time to discuss it.<br />
<br />
Cheers<br />
<br />
--[[User:Sam Hemelryk|Sam Hemelryk]] 08:40, 13 January 2011 (UTC)<br />
<br />
<br />
Why did you just strip local_ from the front of all the table names. I thought that all DB tables were meant to start with the frankenstyle plugin name?--[[User:Tim Hunt|Tim Hunt]] 10:26, 19 January 2011 (UTC)<br />
<br />
: Hi Tim, I removed ''local_'' after finding the 28 character table name limit imposed by XMLDB. I choose to remove ''local_'' rather than using cryptic names. --[[User:Sam Hemelryk|Sam Hemelryk]] 06:56, 21 January 2011 (UTC)<br />
<br />
:: I know the 28 character table name limit is a pain, but we all have to live with it. I still don't see why you should be able to break the coding guidelines. I was specifying something yesterday, and eventually I was able to find table names that fitted and were sensible.<br />
<br />
:: Also, while you claim your table names are non-crypic becuase they are long, actually, while trying to think of better names, I completely misunderstood what the collection thing was about. I thought it was for dealing with the situation where you have, for example, a block and an admin report that, while being separate plugins, rely on each other, so you want to offer them for download as a single package. However, when I read the detail of the document, I find that is wrong. So, collection is not only a long word, it is also ambiguous.<br />
<br />
:: Anyway, here are my suggestion to get you within the limit:<br />
<br />
:: review_criterion -> review_test. collection -> set (does not really solve the ambiguous naming, but at least is short. I think a significant part of your problem is that this concept overlaps very heavily with tags, but presumably you want tags to be crowd-sourced). Then I would cop out and just use an abbreviation for version, say ver or vers. That solves the rest of your problems. <br />
<br />
1234567890123456789012345678<br />
local_contrib_plugin<br />
local_contrib_vers<br />
local_contrib_vers_download<br />
local_contrib_category<br />
local_contrib_contributor<br />
local_contrib_set<br />
local_contrib_set_plugin<br />
local_contrib_software_vers<br />
local_contrib_supported_vers<br />
local_contrib_review<br />
local_contrib_review_test<br />
local_contrib_review_outcome<br />
local_contrib_awards<br />
local_contrib_plugin_awards<br />
1234567890123456789012345678<br />
<br />
::I think the best solution to the ambiguity of what some of the table names means is better table comments. At the moment, some of the comments only make sense if you have read the full spec, which will not be try for people who are just looking at the code.--[[User:Tim Hunt|Tim Hunt]] 08:43, 21 January 2011 (UTC)<br />
<br />
Hi Tim, thanks for the feedback.<br />
<br />
The 28 character table name limit is a bit of a pain, but I do see your point and happy to add ''local_'' back into the mix and refactor the table names as suggested.<br />
<br />
Your observations regarding collections are correct, it is very similar to tags however only those with the required capabilities will be able to manage/add to them. The name collections is perhaps a bit vague and as it will be way to long I think using ''set'' instead is a good idea.<br />
<br />
I will also go through and revise the table comments :)<br />
<br />
Cheers --[[User:Sam Hemelryk|Sam Hemelryk]] 01:41, 24 January 2011 (UTC)<br />
<br />
== typo? ==<br />
<br />
* ''''Version control systems and downloads''''<br />
<br />
With this new system we will start collecting information about the version control system that the contributor is using. We gather this information for each version of a plugin that is created and are able to collect some or all of the following: ''''the new of the vcs system''''...<br />
<br />
the new ''what'' of ''what'' system?<br />
--[[User:Joseph Rézeau|Joseph Rézeau]] 17:14, 2 February 2011 (UTC)<br />
<br />
== Contrib packages (aka, bundling multiple plugins together) ==<br />
<br />
This is just a reminder about the current contrib-packages that we are building since ages ago. Is going to be some way to group different plugins and build one package automatically? I think it can help in a lot of situations. Not critical, but interesting IMO. You can ask Anthony about how that is being handled now and how it could be integrated in the new M&P stuff.<br />
<br />
[[User:Eloy Lafuente (stronk7)|Eloy Lafuente (stronk7)]] 20:29, 2 February 2011 (UTC)</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_-_Provide_upwards_compatibility_of_Moodle_1.9.x_backups&diff=80998
Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups
2011-02-02T00:47:10Z
<p>Stronk7: /* Overall process */</p>
<hr />
<div>{{Template:Development:Backup 2.0}}{{Moodle_2.0}}{{Work in progress}}<br />
<br />
While the [[Development:Backup 2.0 multiple formats|Backup 2.0 multiple formats]] document describes how different formats will be supported by the restore process in Moodle 2.0, it's going to be a highly complex task to perform the transformation of Moodle 1.9.x backups into the new, improved, Moodle 2.x backup format. <br />
<br />
Too many things have changed between both versions to be able to achieve this easily. Surely it's computable (as long as upgrade is being able to apply the correct logic, so restore will) but it is going to be handled as a separate development that will allow us to 1) be centered in the 2.0 backup/restore and 2) be free (both in mind and implementation) from any 1.9.x XML format dependency.<br />
<br />
=== Goals and basis ===<br />
<br />
* The main goal is to create one '''conversion''' tool, able to get any Moodle 1.9 backup file and convert it to one Moodle 2.0 backup file. The tool '''will not perform any modification''' in the Moodle instance where it is being executed (i.e.the tool won't import anything). Once the conversion has finished, the standard Moodle 2.0 restore functionality will perform its job.<br />
* The tool will get one already-uncompressed directory containing one Moodle 1.9 backup file and will create all the needed stuff in the same directory.<br />
* The tool will have one unique entry point to perform the conversion and will be able to be invoked from within Moodle 2.0 (restore, performing conversion on the fly) or standalone (from CLI interface of any sort of batch processing).<br />
* The tool will be built using as much infrastructure from Moodle 2.0 as possible (xml processors, plugins, core stuff, logging, debugging...) and will be full OOP (and php, of course).<br />
* Ideally the conversion will happen in only 1-pass of xml parsing.<br />
* The tool will be licensed under GPL3 or later and bundled with future releases of Moodle.<br />
<br />
=== Introduction ===<br />
<br />
Before any further analysis is highly recommended to:<br />
<br />
* Know as much as possible about the Moodle 2.0 backup infrastructure. Reading the [[Development:Backup 2.0 general architecture| general architecture page]], looking at all the stuff available under the backup/moodle2 directories (each plugin has its own) and understanding how information flows and is stored.<br />
* Pay special attention and understand these parts of the Moodle 2.0 backup infrastructure:<br />
** XML parser: In charge of reading all the XML file and dispatching pieces to different processors (backup/util/xml/parser).<br />
** XML writer: In charge of writing XML files (util/xml/xml_writer.class.php and util/xml/output)<br />
** Chained loggers: To output any information about the process (backup/util/loggers).<br />
** Temporary tables, to store transient information if needed.<br />
<br />
==== Physical differences ====<br />
<br />
After reading the [[Development:Backup 2.0 general architecture| general architecture page]], it's clear that there are huge differences between the XML used in Moodle 1.9 backups and their Moodle 2.0 counterparts. Let's dissect them briefly:<br />
<br />
* We have changed from one unique monolithic '''moodle.xml''' file to a multiple xml files (and directories) alternative.<br />
* The course, each section and each activity has its own directory.<br />
* There are some top-level XML files (groups, users, files, questions, roles, scales...) acting as "containers" of information referenced from any course/section/activity (by their inforef.xml files).<br />
* We have moved from uppercase tags to lowercase everywhere<br />
* We are using XML attributes for some pieces of information (mainly ids).<br />
* When possible (modules mainly) the old XML-tree structure has been observed.<br />
<br />
==== Logical differences ====<br />
<br />
A lot of things have changed from Moodle 1.9 to Moodle 2.0, causing a lot of modifications in the DB schema and, as backup is highly dependent of that (it's basically one representation of the DB), the information present in the physical xml files above has changed in a noticeable way too.<br />
<br />
One good exercise is to create one, more or less, complete test course, backup it in Moodle 1.9, upgrade the site to Moodle 2.0 and backup it again. That way you'll see where each bit of information has ended in the new format. Also is a good task, in order to understand the changes, to read all the db/upgrade.php scripts present in Moodle 2.0. They show all the modifications performed along the time.<br />
<br />
At this point it's important to avoid get stressed, yes, there are many differences and tons of modifications, some of them really complex. But good news is that, if the upgrade.php scripts have been able to perform the change then, for sure, it is computable and the conversion tool will be able to do the same.<br />
<br />
Back to the logical differences, there are some of them needing special attention since day 0 (now):<br />
<br />
* '''files:''' Under Moodle 1.9, files were stored both in the named "course files" directory (one physical directory) and also under the "moddata" directory (files belonging to modules, like forum attachments, assignment submissions...). Under Moodle 2.0, all the files are physically stored into one file pool (a really cryptic hash-based storage solution) with one logical store in DB, with contexts, components, file areas, hashes and items. The conversion tool will need one sort of "file conversion tool" able to handle any transformation from the old to the new approach, used everywhere.<br />
* '''roles and enrolments:''' Moodle 1.9 enrolments were, simply, some role assignments performed at course level. This has been changed to a more powerful (dual) structure of both role assignments and proper enrollment-plugins. The conversion toll will need to do some "assumptions" in order to convert this information. Also it's important to note that, while in Moodle 1.9 backups the complete roles were being sent to XML (with all their capabilities and friends), this doesn't' happen anymore in Moodle 2.0 (where we only store basic information about them).<br />
* '''contexts:''' Under Moodle 1.9, the use of contexts (the course, each activity, each user is one, unique context) was really limited (basically only used for roles and capabilities. Under Moodle 2.0, there are way more information based on contexts (files, comments, ratings, filters, blocks...). Hence we'll need to assign one context for each component in the backup to be able to associate information to it along the conversion.<br />
* '''categories and questions:''' while the internal representation is pretty similar, now they are handled via standard plugins backup & restore in Moodle 2.0 (see question/type/xxxx/backup/moodle2) so some extra information (extra xml-levels) is required. The tool also should be handling the conversion in a plugin way, allowing other 3rd-part question types conversions to be implemented.<br />
* '''blocks:''' 90% of blocks haven't any special DB representation nor need especial processing, but the rest (see, for example, the html block or the rss_client one) need custom conversion. So the tool must allow conversion of blocks also in a plugin way.<br />
* '''activities:''' This is the most important part, where all the (educational POV) information resides. Of course, it must work in a plugin way. Here we'll find activities really easy to convert, because the only noticeable change has been their conversion to the new "files" (commented above). For example, the choice, glossary, forum... modules are good candidates to start with. But there are also some activities that have been completely rewritten / modified since Moodle 1.9. And they will be, without doubts, the most difficult ones to be handled by the conversion tool. Let's see some of them:<br />
** '''resource:''' Under Moodle 1.9 all we had were types of resources (page, directory...) but all them being types of the (unique) resource module. Under Moodle 2.0, the the module has been split into different modules, each one with its own DB representation and unique features (file, folder, page and url). This split will need to be detected and handled specially by the conversion tool.<br />
** '''wiki:''' Completely rewritten from scratch. Will need important changes both in the xml representation (100% different DB structure) and special process of all the contents (to translate from the old ewiki dialect to the new html implementation). Not to talk about binary contents that will also need special handling.<br />
** '''workshop:''' Also completely rewritten from scratch. Will need important changes in the xml representation, use of subplugins and special process of some contents.<br />
<br />
=== Overall process ===<br />
<br />
Here there is one ordered list that could serve as technical/development roadmap for the analysis and implementation of the Moodle 1.9 conversion tool. Surely some (practically all) the points below can be split into smaller tasks in order to allow work to advance in parallel. Ideally all them should have one representation as subtasks of MDL-22414. Each task has one alphanumeric code to be used as reference in the future:<br />
<br />
* '''A''': Preliminary Tasks<br />
** '''A1''': Initial report (this document)<br />
** '''A2''': Organization / roles / actors involved<br />
** '''A3''': Initial timeline specification<br />
** '''A4''': Documentation / research / learn<br />
** '''A5''': Testing use cases, QA specifications<br />
* '''B''': Infrastructure Tasks<br />
** '''B1''': XML Parser<br />
** '''B2''': Conversion dispatcher<br />
** '''B3''': XML writer<br />
** '''B4''': Support for plugins (questions, blocks, modules...)<br />
** '''B5''': Support for subplugins (workshop, assignments...)<br />
** '''B6''': Integration with Moodle 2.0 restore, logging, output...<br />
** '''B7''': Progress review / discuss / adjust / timeline<br />
* '''C''': Conversion Development Tasks<br />
** '''C1''': Globals (files / users / groups / scales / outcomes / roles / gradebook ...)<br />
** '''C2''': Course level information<br />
** '''C3''': Section level information<br />
** '''C4''': Activity level information<br />
** '''C5''': Commons (comments / completion / filters / grades / roles /logs ...)<br />
<br />
===See also===<br />
<br />
* MDL-22414 - the main tracker issue for this task</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_-_Provide_upwards_compatibility_of_Moodle_1.9.x_backups&diff=80997
Development:Backup 2.0 - Provide upwards compatibility of Moodle 1.9.x backups
2011-02-02T00:45:53Z
<p>Stronk7: </p>
<hr />
<div>{{Template:Development:Backup 2.0}}{{Moodle_2.0}}{{Work in progress}}<br />
<br />
While the [[Development:Backup 2.0 multiple formats|Backup 2.0 multiple formats]] document describes how different formats will be supported by the restore process in Moodle 2.0, it's going to be a highly complex task to perform the transformation of Moodle 1.9.x backups into the new, improved, Moodle 2.x backup format. <br />
<br />
Too many things have changed between both versions to be able to achieve this easily. Surely it's computable (as long as upgrade is being able to apply the correct logic, so restore will) but it is going to be handled as a separate development that will allow us to 1) be centered in the 2.0 backup/restore and 2) be free (both in mind and implementation) from any 1.9.x XML format dependency.<br />
<br />
=== Goals and basis ===<br />
<br />
* The main goal is to create one '''conversion''' tool, able to get any Moodle 1.9 backup file and convert it to one Moodle 2.0 backup file. The tool '''will not perform any modification''' in the Moodle instance where it is being executed (i.e.the tool won't import anything). Once the conversion has finished, the standard Moodle 2.0 restore functionality will perform its job.<br />
* The tool will get one already-uncompressed directory containing one Moodle 1.9 backup file and will create all the needed stuff in the same directory.<br />
* The tool will have one unique entry point to perform the conversion and will be able to be invoked from within Moodle 2.0 (restore, performing conversion on the fly) or standalone (from CLI interface of any sort of batch processing).<br />
* The tool will be built using as much infrastructure from Moodle 2.0 as possible (xml processors, plugins, core stuff, logging, debugging...) and will be full OOP (and php, of course).<br />
* Ideally the conversion will happen in only 1-pass of xml parsing.<br />
* The tool will be licensed under GPL3 or later and bundled with future releases of Moodle.<br />
<br />
=== Introduction ===<br />
<br />
Before any further analysis is highly recommended to:<br />
<br />
* Know as much as possible about the Moodle 2.0 backup infrastructure. Reading the [[Development:Backup 2.0 general architecture| general architecture page]], looking at all the stuff available under the backup/moodle2 directories (each plugin has its own) and understanding how information flows and is stored.<br />
* Pay special attention and understand these parts of the Moodle 2.0 backup infrastructure:<br />
** XML parser: In charge of reading all the XML file and dispatching pieces to different processors (backup/util/xml/parser).<br />
** XML writer: In charge of writing XML files (util/xml/xml_writer.class.php and util/xml/output)<br />
** Chained loggers: To output any information about the process (backup/util/loggers).<br />
** Temporary tables, to store transient information if needed.<br />
<br />
==== Physical differences ====<br />
<br />
After reading the [[Development:Backup 2.0 general architecture| general architecture page]], it's clear that there are huge differences between the XML used in Moodle 1.9 backups and their Moodle 2.0 counterparts. Let's dissect them briefly:<br />
<br />
* We have changed from one unique monolithic '''moodle.xml''' file to a multiple xml files (and directories) alternative.<br />
* The course, each section and each activity has its own directory.<br />
* There are some top-level XML files (groups, users, files, questions, roles, scales...) acting as "containers" of information referenced from any course/section/activity (by their inforef.xml files).<br />
* We have moved from uppercase tags to lowercase everywhere<br />
* We are using XML attributes for some pieces of information (mainly ids).<br />
* When possible (modules mainly) the old XML-tree structure has been observed.<br />
<br />
==== Logical differences ====<br />
<br />
A lot of things have changed from Moodle 1.9 to Moodle 2.0, causing a lot of modifications in the DB schema and, as backup is highly dependent of that (it's basically one representation of the DB), the information present in the physical xml files above has changed in a noticeable way too.<br />
<br />
One good exercise is to create one, more or less, complete test course, backup it in Moodle 1.9, upgrade the site to Moodle 2.0 and backup it again. That way you'll see where each bit of information has ended in the new format. Also is a good task, in order to understand the changes, to read all the db/upgrade.php scripts present in Moodle 2.0. They show all the modifications performed along the time.<br />
<br />
At this point it's important to avoid get stressed, yes, there are many differences and tons of modifications, some of them really complex. But good news is that, if the upgrade.php scripts have been able to perform the change then, for sure, it is computable and the conversion tool will be able to do the same.<br />
<br />
Back to the logical differences, there are some of them needing special attention since day 0 (now):<br />
<br />
* '''files:''' Under Moodle 1.9, files were stored both in the named "course files" directory (one physical directory) and also under the "moddata" directory (files belonging to modules, like forum attachments, assignment submissions...). Under Moodle 2.0, all the files are physically stored into one file pool (a really cryptic hash-based storage solution) with one logical store in DB, with contexts, components, file areas, hashes and items. The conversion tool will need one sort of "file conversion tool" able to handle any transformation from the old to the new approach, used everywhere.<br />
* '''roles and enrolments:''' Moodle 1.9 enrolments were, simply, some role assignments performed at course level. This has been changed to a more powerful (dual) structure of both role assignments and proper enrollment-plugins. The conversion toll will need to do some "assumptions" in order to convert this information. Also it's important to note that, while in Moodle 1.9 backups the complete roles were being sent to XML (with all their capabilities and friends), this doesn't' happen anymore in Moodle 2.0 (where we only store basic information about them).<br />
* '''contexts:''' Under Moodle 1.9, the use of contexts (the course, each activity, each user is one, unique context) was really limited (basically only used for roles and capabilities. Under Moodle 2.0, there are way more information based on contexts (files, comments, ratings, filters, blocks...). Hence we'll need to assign one context for each component in the backup to be able to associate information to it along the conversion.<br />
* '''categories and questions:''' while the internal representation is pretty similar, now they are handled via standard plugins backup & restore in Moodle 2.0 (see question/type/xxxx/backup/moodle2) so some extra information (extra xml-levels) is required. The tool also should be handling the conversion in a plugin way, allowing other 3rd-part question types conversions to be implemented.<br />
* '''blocks:''' 90% of blocks haven't any special DB representation nor need especial processing, but the rest (see, for example, the html block or the rss_client one) need custom conversion. So the tool must allow conversion of blocks also in a plugin way.<br />
* '''activities:''' This is the most important part, where all the (educational POV) information resides. Of course, it must work in a plugin way. Here we'll find activities really easy to convert, because the only noticeable change has been their conversion to the new "files" (commented above). For example, the choice, glossary, forum... modules are good candidates to start with. But there are also some activities that have been completely rewritten / modified since Moodle 1.9. And they will be, without doubts, the most difficult ones to be handled by the conversion tool. Let's see some of them:<br />
** '''resource:''' Under Moodle 1.9 all we had were types of resources (page, directory...) but all them being types of the (unique) resource module. Under Moodle 2.0, the the module has been split into different modules, each one with its own DB representation and unique features (file, folder, page and url). This split will need to be detected and handled specially by the conversion tool.<br />
** '''wiki:''' Completely rewritten from scratch. Will need important changes both in the xml representation (100% different DB structure) and special process of all the contents (to translate from the old ewiki dialect to the new html implementation). Not to talk about binary contents that will also need special handling.<br />
** '''workshop:''' Also completely rewritten from scratch. Will need important changes in the xml representation, use of subplugins and special process of some contents.<br />
<br />
=== Overall process ===<br />
<br />
Here there is one ordered list that could serve as technical/development roadmap for the analysis and implementation of the Moodle 1.9 conversion tool. Surely some (practically all) the points below can be split into smaller tasks in order to allow work to advance in parallel. Ideally all them should have one representation as subtasks of MDL-22414). Each task has one alphanumeric code to be used as reference in the future:<br />
<br />
* '''A''': Preliminary Tasks<br />
** '''A1''': Initial report (this document)<br />
** '''A2''': Organization / roles / actors involved<br />
** '''A3''': Initial timeline specification<br />
** '''A4''': Documentation / research / learn<br />
** '''A5''': Testing use cases, QA specifications<br />
* '''B''': Infrastructure Tasks<br />
** '''B1''': XML Parser<br />
** '''B2''': Conversion dispatcher<br />
** '''B3''': XML writer<br />
** '''B4''': Support for plugins (questions, blocks, modules...)<br />
** '''B5''': Support for subplugins (workshop, assignments...)<br />
** '''B6''': Integration with Moodle 2.0 restore, logging, output...<br />
** '''B7''': Progress review / discuss / adjust / timeline<br />
* '''C''': Conversion Development Tasks<br />
** '''C1''': Globals (files / users / groups / scales / outcomes / roles / gradebook ...)<br />
** '''C2''': Course level information<br />
** '''C3''': Section level information<br />
** '''C4''': Activity level information<br />
** '''C5''': Commons (comments / completion / filters / grades / roles /logs ...)<br />
<br />
===See also===<br />
<br />
* MDL-22414 - the main tracker issue for this task</div>
Stronk7
https://docs.moodle.org/25/en/index.php?title=Development:Backup_2.0_multiple_formats&diff=80996
Development:Backup 2.0 multiple formats
2011-02-01T22:59:25Z
<p>Stronk7: </p>
<hr />
<div>{{Template:Development:Backup 2.0}}{{Work in progress}}{{Moodle_2.0}}<br />
<br />
One of the major goals of the [[Development:Backup 2.0|Moodle 2.0 backup]] development is to be able to support multiple formats, both on export (backup) and import (restore), all them handled from core backup/restore code in a central and unified way.<br />
<br />
This document explains how those formats will work and interact with Moodle, defining responsibilities and data flow between each part.<br />
<br />
== Basic Concepts ==<br />
<br />
Moodle 2.0 has one unique, '''documented''', valid XML format. Details about it can be found in the [[Development:Backup 2.0 XML format|Backup 2.0 XML format]] page. <font color="red">(note the page doesn't exist yet because it's one of the parts being researched in the next weeks)</font> This will be the '''M20-BCK''' format. It's highly possible that this format will end being noticeably different from current (monolithic) format used in Moodle 1.9, although internal structures will remain pretty similar.<br />
<br />
Also, there is one unique, '''undocumented''' (but easily readable and understandable because it's basically one DB dump) XML format used before Moodle 2.0, let's call it the '''M19-BCK''' (from Moodle 1.9) format. It's an important format because we need to guarantee that any M19-BCK file will be properly restored in Moodle 2.0.<br />
<br />
And then there are various formats, let's call them '''3RD-BCK''' (3rd part backup formats) that should provide Moodle with extra backup / restore abilities. Notorious examples of these formats are: Blackboard 5.5, Blackboard 6.0 (see [http://cvs.moodle.org/moodle/backup/bb/?pathrev=MOODLE_19_STABLE cvs] to see how they are working in Moodle 1.x), or the new [http://www.imsglobal.org/cc/index.html IMS CC] format. In any case, all them will work in the same way under Moodle 2.0, so let's put them under the "3RD-BCK" umbrella.<br />
<br />
== Restore Data Flow ==<br />
<br />
Here it's one general overview of how those multiple formats are supported on restore. It handles M20-BCK backups (in blue, main restore process) and both 3RD-BCK and M19-BCK formats (in green, handling other formats sub-process).<br />
<br />
[[Image:RestoreFormatsActivityDiagram.png|640px]]<br />
<br />
([[Media:RestoreFormatsActivityDiagram.dia|original file available here]] - editable with [http://projects.gnome.org/dia Dia])<br />
<br />
== Backup Data Flow ==<br />
<br />
<br />
[[Category:Backup]]</div>
Stronk7