xpdfrc(5) File Formats Manual xpdfrc(5)

xpdfrc - configuration file for Xpdf tools (version 4.05)

All of the Xpdf tools read a single configuration file.

On Linux/Unix/MacOS: if you have a .xpdfrc file in your home directory, it will be read. Otherwise, a system-wide configuration file will be read from /etc/xpdfrc, if it exists. (This is its default location; depending on build options, it may be placed elsewhere.)

On Windows: the file must be named xpdfrc (no leading dot, no extension), and must be placed in the same directory as the executable (pdftotext.exe, xpdf.exe, etc.)

The xpdfrc file consists of a series of configuration options, one per line. Blank lines and lines starting with a ´#' (comments) are ignored.

Arguments can be single-quoted or double-quoted, e.g., for file names that contain spaces ("aaa bbb", 'aaa bbb'). This quoting does not provide any escaping, so there's no way to include a double quote in a double-quoted argument or a single quote in a single-quoted argument.

Arguments can also be at-quoted: @"aaa bbb". At-quoted strings allow use of the DATADIR variable, which is set to the 'data' subdirectory in the xpdf install directory. The percent sign (%) is an escape character: a percent sign followed by any other character is replaced with that character.

@"abc %"def%" ghi" --> abc "def" ghi    
@"${DATADIR}/foo"  --> ...install-dir.../data/foo
@"%${DATADIR}/foo" --> ${DATADIR}/foo

The following sections list all of the configuration options, sorted into functional groups. There is an examples section at the end.

Includes the specified config file. The effect of this is equivalent to inserting the contents of config-file directly into the parent config file in place of the include command. Config files can be nested arbitrarily deeply.

Maps a PDF font, PDF-font-name, to a font for display or PostScript output. The font file, font-file, can be any type allowed in a PDF file. This command can be used for 8-bit or 16-bit (CID) fonts.
Specifies a search directory for font files. There can be multiple fontDir commands; all of the specified directories will be searched in order. The font files can be Type 1 (.pfa or .pfb) or TrueType (.ttf or .ttc); other files in the directory will be ignored. The font file name (not including the extension) must exactly match the PDF font name. This search is performed if the font name doesn't match any of the fonts declared with the fontFile command. There are no default fontDir directories.
Maps the registry-ordering character collection to a font for display or PostScript output. This mapping is used if the font name doesn't match any of the fonts declared with the fontFile, fontDir, psResidentFont16, or psResidentFontCC commands.

If set to "yes", pass 8-bit font names through to the PostScript output without substitution. Fonts which are not embedded in the PDF file are expected to be available on the printer. This defaults to "no".
When the 8-bit font PDF-font-name is used (without embedding) in a PDF file, it will be translated to the PostScript font PS-font-name, which is assumed to be resident in the printer. Typically, PDF-font-name and PS-font-name are the same. By default, only the Base-14 fonts are assumed to be resident.
When the 16-bit (CID) font PDF-font-name with writing mode wMode is used (without embedding) in a PDF file, it will be translated to the PostScript font PS-font-name, which is assumed to be resident in the printer. The writing mode must be either ´H' for horizontal or ´V' for vertical. The resident font is assumed to use the specified encoding (which must have been defined with the unicodeMap command).
When a 16-bit (CID) font using the registry-ordering character collection and wMode writing mode is used (without embedding) in a PDF file, the PostScript font, PS-font-name, is substituted for it. The substituted font is assumed to be resident in the printer. The writing mode must be either ´H' for horizontal or ´V' for vertical. The resident font is assumed to use the specified encoding (which must have been defined with the unicodeMap command).
If set to "no", prevents embedding of Type 1 fonts in generated PostScript. This defaults to "yes".
If set to "no", prevents embedding of TrueType fonts in generated PostScript. This defaults to "yes".
If set to "no", prevents embedding of CID TrueType fonts in generated PostScript. For Level 3 PostScript, this generates a CID font, for lower levels it generates a non-CID composite font. This defaults to "yes".
If set to "no", prevents embedding of CID PostScript fonts in generated PostScript. For Level 3 PostScript, this generates a CID font, for lower levels it generates a non-CID composite font. This defaults to "yes".

Sets the paper size for PostScript output. The width and height parameters give the paper size in PostScript points (1 point = 1/72 inch).
Sets the paper size for PostScript output to a standard size. The default paper size is set when xpdf and pdftops are built, typically to "letter" or "A4". This can also be set to "match", which will set the paper size to match the size specified in the PDF file.
Sets the imageable area for PostScript output. The four integers are the coordinates of the lower-left and upper-right corners of the imageable region, specified in points (with the origin being the lower-left corner of the paper). This defaults to the full paper size; the psPaperSize option will reset the imageable area coordinates.
If set to "yes", PostScript output is cropped to the CropBox specified in the PDF file; otherwise no cropping is done. This defaults to "yes".
If set to "yes", PostScript output treats the CropBox as the page size. By default, this is "no", and the MediaBox is used as the page size.
If set to "yes", PDF pages smaller than the PostScript imageable area are expanded to fill the imageable area. Otherwise, no scaling is done on smaller pages. This defaults to "no".
If set to yes, PDF pages larger than the PostScript imageable area are shrunk to fit the imageable area. Otherwise, no scaling is done on larger pages. This defaults to "yes".
If set to yes, PDF pages smaller than the PostScript imageable area (after any scaling) are centered in the imageable area. Otherwise, they are aligned at the lower-left corner of the imageable area. This defaults to "yes".
If set to "yes", the generated PostScript will set the "Duplex" pagedevice entry. This tells duplex-capable printers to enable duplexing. This defaults to "no".
Sets the PostScript level to generate. This defaults to "level2".
If set to "yes", PDF forms are converted to PS procedures, and image data is preloaded. This uses more memory in the PostScript interpreter, but generates significantly smaller PS files in situations where, e.g., the same image is drawn on every page of a long document. This defaults to "no".
If set to "yes", generates PostScript OPI comments for all images and forms which have OPI information. This option is only available if the Xpdf tools were compiled with OPI support. This defaults to "no".
If set to "yes", the ASCIIHexEncode filter will be used instead of ASCII85Encode for binary data. This defaults to "no".
If set to "yes", the LZWEncode filter will be used for lossless compression in PostScript output; if set to "no", the RunLengthEncode filter will be used instead. LZW generates better compression (smaller PS files), but may not be supported by some printers. This defaults to "yes".
If set to "yes", all preloaded images in PS files will uncompressed. If set to "no", the original compressed images will be used when possible. The "yes" setting is useful to work around certain buggy PostScript interpreters. This defaults to "no".
Set the minimum line width, in points, for PostScript output. The default value is 0 (no minimum).
Set the resolution (in dpi) for rasterized pages in PostScript output. (Pdftops will rasterize pages which use transparency.) This defaults to 300.
If set to "yes", rasterized pages in PS files will be monochrome (8-bit gray) instead of color. This defaults to "no".
When rasterizing pages, pdftops splits the page into horizontal "slices", to limit memory usage. This option sets the maximum slice size, in pixels. This defaults to 20000000 (20 million).
If set to "yes", all PostScript output will be rasterized. This defaults to "no".
Pdftops rasterizes an pages that use transparency (because PostScript doesn't support transparency). If psNeverRasterize is set to "yes", rasterization is disabled: pages will never be rasterized, even if they contain transparency. This will likely result in incorrect output for PDF files that use transparency, and a warning message to that effect will be printed. This defaults to "no".
See the description above, in the DISPLAY FONTS section.

Sets the encoding to use for text output. (This can be overridden with the "-enc" switch on the command line.) The encoding-name must be defined with the unicodeMap command (see above). This defaults to "Latin1".
Sets the end-of-line convention to use for text output. The options are:
    unix = LF
    dos  = CR+LF
    mac  = CR
(This can be overridden with the "-eol" switch on the command line.) The default value is based on the OS where xpdf and pdftotext were built.
If set to "yes", text extraction will insert page breaks (form feed characters) between pages. This defaults to "yes".
If set to "yes", text extraction will keep all characters. If set to "no", text extraction will discard tiny (smaller than 3 point) characters after the first 50000 per page, avoiding extremely slow run times for PDF files that use special fonts to do shading or cross-hatching. This defaults to "yes".
Specifies a file with the mapping from character names to Unicode. This is used to handle PDF fonts that have valid encodings but no ToUnicode entry. Each line of a nameToUnicode file looks like this:

hex-string name

The hex-string is the Unicode (UCS-2) character index, and name is the corresponding character name. Multiple nameToUnicode files can be used; if a character name is given more than once, the code in the last specified file is used. There is a built-in default nameToUnicode table with all of Adobe's standard character names.

Specifies the file with the mapping from character collection to Unicode. Each line of a cidToUnicode file represents one character:

hex-string

The hex-string is the Unicode (UCS-2) index for that character. The first line maps CID 0, the second line CID 1, etc. File size is determined by size of the character collection. Only one file is allowed per character collection; the last specified file is used. There are no built-in cidToUnicode mappings.

This is used to work around PDF fonts which have incorrect Unicode information. It specifies a file which maps from the given (incorrect) Unicode indexes to the correct ones. The mapping will be used for any font whose name contains font-name-substring. Each line of a unicodeToUnicode file represents one Unicode character:

in-hex out-hex1 out-hex2 ...

The in-hex field is an input (incorrect) Unicode index, and the rest of the fields are one or more output (correct) Unicode indexes. Each occurrence of in-hex will be converted to the specified output sequence.

Remap Unicode characters when doing text extraction. This specifies a file that maps from a particular Unicode index to zero or more replacement Unicode indexes. Each line of the remap file represents one Unicode character:

in-hex out-hex1 out-hex2 ...

Any Unicode characters not listed will be left unchanged. This function is typically used to remap things like non-breaking spaces, soft hyphens, ligatures, etc.

Specifies the file with mapping from Unicode to encoding-name. These encodings are used for text output (see below). Each line of a unicodeMap file represents a range of one or more Unicode characters which maps linearly to a range in the output encoding:
     in-start-hex in-end-hex out-start-hex
Entries for single characters can be abbreviated to:
     in-hex out-hex
The in-start-hex and in-end-hex fields (or the single in-hex field) specify the Unicode range. The out-start-hex field (or the out-hex field) specifies the start of the output encoding range. The length of the out-start-hex (or out-hex) string determines the length of the output characters (e.g., UTF-8 uses different numbers of bytes to represent characters in different ranges). Entries must be given in increasing Unicode order. Only one file is allowed per encoding; the last specified file is used. The Latin1, ASCII7, Symbol, ZapfDingbats, UTF-8, and UCS-2 encodings are predefined.
Specifies a search directory, dir, for CMaps for the registry-ordering character collection. There can be multiple directories for a particular collection. There are no default CMap directories.
Specifies a search directory, dir, for ToUnicode CMaps. There can be multiple ToUnicode directories. There are no default ToUnicode directories.
If set to "yes", the Xpdf tools will attempt to map various numeric character names sometimes used in font subsets. In some cases this leads to usable text, and in other cases it leads to gibberish -- there is no way for Xpdf to tell. This defaults to "yes".
If set to "yes", and mapNumericCharNames is set to "no", the Xpdf tools will apply a simple pass-through mapping (Unicode index = character code) for all unrecognized glyph names. (For CID fonts, setting mapNumericCharNames to "no" is unnecessary.) In some cases, this leads to usable text, and in other cases it leads to gibberish -- there is no way for Xpdf to tell. This defaults to "no".
When rasterizing text using an external TrueType font, there are two options for handling character codes. If mapExtTrueTypeFontsViaUnicode is set to "yes", Xpdf will use the font encoding/ToUnicode info to map character codes to Unicode, and then use the font's Unicode cmap to map Unicode to GIDs. If mapExtTrueTypeFontsViaUnicode is set to "no", Xpdf will assume the character codes are GIDs (i.e., use an identity mapping). This defaults to "yes".
If set to "yes", the Xpdf tools will use the Unicode encoding information in TrueType fonts (16-bit only), if avaiable, to override the PDF ToUnicode maps. Otherwise, the ToUnicode maps are always used when present. This defaults to "no".
If set to "yes", Xpdf will ignore any ToUnicode CMaps that don't match the font type (8-bit vs 16-bit). The PDF spec requires ToUnicode CMaps match, and Adobe appears to ignore CMaps that don't match. This defaults to "no" (for backward compatibility).
Drop all text drawn in the specified font. To drop text drawn in unnamed fonts, use:
    dropFont ""
There can be any number of dropFont commands.
If set to "no", pdftotext will attempt to place rotated text into the "correct" location in the output. If set to "yes", when using reading order mode, pdftotext will append rotated text to the end, after unrotated text. This defaults to "no".

Enables or disables use of FreeType (a TrueType / Type 1 font rasterizer). This is only relevant if the Xpdf tools were built with FreeType support. ("enableFreeType" replaces the old "freetypeControl" option.) This option defaults to "yes".
If this is set to "yes", FreeType hinting will be forced off. This option defaults to "no".
Enables or disables font anti-aliasing in the PDF rasterizer. This option affects all font rasterizers. ("antialias" replaces the anti-aliasing control provided by the old "t1libControl" and "freetypeControl" options.) This default to "yes".
Enables or disables anti-aliasing of vector graphics in the PDF rasterizer. This defaults to "yes".
Enables or disables anti-aliasing of image masks (when downsampling or upsampling) in the PDF rasterizer. This defaults to "yes".
If this is "yes", bitmaps sent to the printer will be antialiased (according to the "antialias" and "vectorAntialias" settings). If this is "no", printed bitmaps will not be antialiased. This defaults to "no".
Sets the stroke adjustment mode. If set to "no", no stroke adjustment will be done. If set to "yes", normal stroke adjustment will be done: horizontal and vertical lines will be moved by up to half a pixel to make them look cleaner when vector anti-aliasing is enabled. If set to "cad", a slightly different stroke adjustment algorithm will be used to ensure that lines of the same original width will always have the same adjusted width (at the expense of allowing gaps and overlaps between adjacent lines). This defaults to "yes".
If this is set to "yes", the TilingType is forced to 2 (no distortion) for all tiling patterns, regardless of the setting in the pattern dictionary. This defaults to "no".
Sets the halftone screen type, which will be used when generating a monochrome (1-bit) bitmap. The three options are dispersed-dot dithering, clustered-dot dithering (with a round dot and 45-degree screen angle), and stochastic clustered-dot dithering. By default, "stochasticClustered" is used for resolutions of 300 dpi and higher, and "dispersed" is used for resolutions lower then 300 dpi.
Sets the size of the (square) halftone screen threshold matrix. By default, this is 4 for dispersed-dot dithering, 10 for clustered-dot dithering, and 100 for stochastic clustered-dot dithering.
Sets the halftone screen dot radius. This is only used when screenType is set to stochasticClustered, and it defaults to 2. In clustered-dot mode, the dot radius is half of the screen size. Dispersed-dot dithering doesn't have a dot radius.
Sets the halftone screen gamma correction parameter. Gamma values greater than 1 make the output brighter; gamma values less than 1 make it darker. The default value is 1.
When halftoning, all values below this threshold are forced to solid black. This parameter is a floating point value between 0 (black) and 1 (white). The default value is 0.
When halftoning, all values above this threshold are forced to solid white. This parameter is a floating point value between 0 (black) and 1 (white). The default value is 1.
Set the minimum line width, in device pixels. This affects the rasterizer only, not the PostScript converter (except when it uses rasterization to handle transparency). The default value is 0 (no minimum).
If set to "yes", simplify paths by removing points where it won't make a significant difference to the shape. The default value is "no".
If set to "yes", generate overprint preview output, honoring the OP/op/OPM settings in the PDF file. Ignored for non-CMYK output. The default value is "no".

These settings only apply to the Xpdf GUI PDF viewer.

Sets the initial zoom factor. A number specifies a zoom percentage, where 100 means 72 dpi. You may also specify ´page', to fit the page to the window size, or ´width', to fit the page width to the window width.
If xpdf is started with fit-page or fit-width zoom and no window geometry, it will calculate a desired window size based on the PDF page size and this defaultFitZoom value. I.e., the window size will be chosen such that exactly one page will fit in the window at this zoom factor (which must be a percentage). The default value is based on the screen resolution.
Zoom percentages will be scaled by this factor. By default, 100% zoom corresponds to 72 dpi. Setting zoomScaleFactor to 1.5 will make 100% zoom 1.5x larger, i.e., 108dpi. If this is set to ´actual', the zoom scale factor will be computed based on the screen resolution. The default value is 1.0.
Sets the list of zoom values (percentages) displayed in the zoom combo box. The default list is: 25 50 75 100 110 125 150 175 200 300 400 600 800.
Sets the initial display mode. The default setting is "continuous".
If set to "yes", xpdf opens with the toolbar visible. If set to "no", xpdf opens with the toolbar hidden. The default is "yes".
If set to "yes", xpdf opens with the sidebar (tabs, outline, etc.) visible. If set to "no", xpdf opens with the sidebar collapsed. The default is "yes".
Sets the initial sidebar width, in pixels. This is only relevant if initialSidebarState is "yes". The default value is zero, which tells xpdf to use an internal default size.
Sets the initial selection mode. The default setting is "linear".
Set the "paper color", i.e., the background of the page display. The color can be #RRGGBB (hexadecimal) or a named color. This option will not work well with PDF files that do things like filling in white behind the text.
Set the matte color, i.e., the color used for background outside the actual page area. The color can be #RRGGBB (hexadecimal) or a named color.
Set the matte color for full-screen mode. The color can be #RRGGBB (hexadecimal) or a named color.
Set the selection color. The color can be #RRGGBB (hexadecimal) or a named color.
If set to "no", xpdf's reverse-video mode inverts text and vector graphic content, but not images. If set to "yes", xpdf inverts images as well. The default is "no".
Add a command to the popup menu. Title is the text to be displayed in the menu. Command is an Xpdf command (see the COMMANDS section of the xpdf(1) man page for details). Multiple commands are separated by whitespace.
Set the maximum width of tiles to be used by xpdf when rasterizing pages. This defaults to 1500.
Set the maximum height of tiles to be used by xpdf when rasterizing pages. This defaults to 1500.
Set the maximum number of tiles to be cached by xpdf when rasterizing pages. This defaults to 10.
Set the number of worker threads to be used by xpdf when rasterizing pages. This defaults to 1.
PDF links, including outline items, can include a new zoom level. If this setting is "yes", Xpdf changes the zoom when links are clicked; if "no", Xpdf moves to the destination but does not change the zoom. This defaults to "yes".
Sets the command executed when you click on a "launch"-type link. The intent is for the command to be a program/script which determines the file type and runs the appropriate viewer. The command line will consist of the file to be launched, followed by any parameters specified with the link. Do not use "%s" in "command". By default, this is unset, and Xpdf will simply try to execute the file (after prompting the user).
Sets the command executed when you click on a movie annotation. The string "%s" will be replaced with the movie file name. This has no default value.
Sets the default printer used in the viewer's print dialog.
Add a key or mouse button binding. Modifiers can be zero or more of:
    shift-
    ctrl-
    alt-
Key can be a regular ASCII character, or any one of:
    space
    tab
    return
    enter
    backspace
    esc
    insert
    delete
    home
    end
    pgup
    pgdn
    left / right / up / down                (arrow keys)
    f1 .. f35                               (function keys)
    mousePress1 .. mousePress7              (mouse buttons)
    mouseRelease1 .. mouseRelease7          (mouse buttons)
    mouseClick1 .. mouseClick7              (mouse buttons)
    mouseDoubleClick1 .. mouseDoubleClick7  (mouse buttons)
    mouseTripleClick1 .. mouseTripleClick7  (mouse buttons)
Context is either "any" or a comma-separated combination of:
    fullScreen / window       (full screen mode on/off)
    continuous / singlePage   (continuous mode on/off)
    overLink / offLink        (mouse over link or not)
    scrLockOn / scrLockOff    (scroll lock on/off)
The context string can include only one of each pair in the above list.

Command is an Xpdf command (see the COMMANDS section of the xpdf(1) man page for details). Multiple commands are separated by whitespace.

The bind command replaces any existing binding, but only if it was defined for the exact same modifiers, key, and context. All tokens (modifiers, key, context, commands) are case-sensitive.

Example key bindings:

    # bind ctrl-a in any context to the nextPage
    # command
    bind ctrl-a any nextPage
    # bind uppercase B, when in continuous mode
    # with scroll lock on, to the reload command
    # followed by the prevPage command
    bind B continuous,scrLockOn reload prevPage
See the xpdf(1) man page for more examples.
Removes a key binding established with the bind command. This is most useful to remove default key bindings before establishing new ones (e.g., if the default key binding is given for "any" context, and you want to create new key bindings for multiple contexts).
Sets the file used by the loadTabState and saveTabState commands (see the xpdf(1) man page for more information). The default path is ~/.xpdf.tabstate.
Sets the file used by the saveSession and loadSession commands (see the xpdf(1) man page for more information). The default path is ~/.xpdf.session. When xpdf automatically saves the session via a session manager, it appends ".managed" to the path.
If set to "yes", xpdf will automatically save the current session (equivalent to the saveSession command) when quitting (via the menu or a key binding). The default value is "yes".

If set to "no", annotations will not be drawn or printed. The default value is "yes".
If set to "no", form fields will not be drawn or printed. The default value is "yes".
If an XFA form is present, and this option is set to "yes", Xpdf will parse the XFA form and use certain XFA information to override AcroForm information. If set to "no", the XFA form will not be read. The default value is "yes".
If set to "yes", xpdf will save the current page numbers of all open files in ~/.xpdf.pages when the files are closed (or when quitting xpdf). Next time the file is opened, the last-viewed page number will be restored. The default value is "yes".
If set to "yes", drawing commands are printed as they're executed (useful for debugging). This defaults to "no".
If set to "yes", print a status message (to stdout) before each page is processed. This defaults to "no".
If set to "yes", this suppresses all error and warning messages from all of the Xpdf tools. This defaults to "no".

The following is a sample xpdfrc file.

# from the Thai support package
nameToUnicode /usr/local/share/xpdf/Thai.nameToUnicode
# from the Japanese support package
cidToUnicode Adobe-Japan1 /usr/local/share/xpdf/Adobe-Japan1.cidToUnicode
unicodeMap   JISX0208     /usr/local/share/xpdf/JISX0208.unicodeMap
cMapDir      Adobe-Japan1 /usr/local/share/xpdf/cmap/Adobe-Japan1
# use the Base-14 Type 1 fonts from ghostscript
fontFile Times-Roman           /usr/local/share/ghostscript/fonts/n021003l.pfb
fontFile Times-Italic          /usr/local/share/ghostscript/fonts/n021023l.pfb
fontFile Times-Bold            /usr/local/share/ghostscript/fonts/n021004l.pfb
fontFile Times-BoldItalic      /usr/local/share/ghostscript/fonts/n021024l.pfb
fontFile Helvetica             /usr/local/share/ghostscript/fonts/n019003l.pfb
fontFile Helvetica-Oblique     /usr/local/share/ghostscript/fonts/n019023l.pfb
fontFile Helvetica-Bold        /usr/local/share/ghostscript/fonts/n019004l.pfb
fontFile Helvetica-BoldOblique /usr/local/share/ghostscript/fonts/n019024l.pfb
fontFile Courier               /usr/local/share/ghostscript/fonts/n022003l.pfb
fontFile Courier-Oblique       /usr/local/share/ghostscript/fonts/n022023l.pfb
fontFile Courier-Bold          /usr/local/share/ghostscript/fonts/n022004l.pfb
fontFile Courier-BoldOblique   /usr/local/share/ghostscript/fonts/n022024l.pfb
fontFile Symbol                /usr/local/share/ghostscript/fonts/s050000l.pfb
fontFile ZapfDingbats          /usr/local/share/ghostscript/fonts/d050000l.pfb
# use the Bakoma Type 1 fonts
# (this assumes they happen to be installed in /usr/local/fonts/bakoma)
fontDir /usr/local/fonts/bakoma
# set some PostScript options
psPaperSize          letter
psDuplex             no
psLevel              level2
psEmbedType1Fonts    yes
psEmbedTrueTypeFonts yes
# assume that the PostScript printer has the Univers and
# Univers-Bold fonts
psResidentFont Univers      Univers
psResidentFont Univers-Bold Univers-Bold
# set the text output options
textEncoding UTF-8
textEOL      unix
# misc options
enableFreeType  yes
launchCommand   viewer-script

/etc/xpdfrc
This is the default location for the system-wide configuration file. Depending on build options, it may be placed elsewhere.
$HOME/.xpdfrc
This is the user's configuration file. If it exists, it will be read in place of the system-wide file.

The Xpdf software and documentation are copyright 1996-2024 Glyph & Cog, LLC.

xpdf(1), pdftops(1), pdftotext(1), pdftohtml(1), pdfinfo(1), pdffonts(1), pdfdetach(1), pdftoppm(1), pdftopng(1), pdfimages(1)
http://www.xpdfreader.com/

08 Feb 2024